ruby-on-rails - Rails Digest::UUID v5 (vs) Postgresql uuid-ossp v5

标签 ruby-on-rails postgresql uuid

在使用 Rails Digest::UUID 和 Postgresql uuid-ossp 生成时,我得到了不同的 V5 UUID。

rails :

[58] pry(main)> Digest::UUID.uuid_v5('e90bf6ab-f698-4faa-9d0f-810917dea53a', 'e90bf6ab-f698-4faa-9d0f-810917dea53a')
=> "db68e7ad-332a-57a7-9638-a507f76ded93"

Postgresql uuid-ossp:

select uuid_generate_v5('e90bf6ab-f698-4faa-9d0f-810917dea53a', 'e90bf6ab-f698-4faa-9d0f-810917dea53a');
           uuid_generate_v5
--------------------------------------
 6c569b95-a6fe-5553-a6f5-cd871ab30178

会是什么原因呢?我认为当输入相同时两者应该生成相同的 UUID,但它是不同的!

最佳答案

似乎提出了一个补丁,以便可以显式启用 namespace 的工作字符串表示

  • The new behavior will be enabled by setting the config.active_support.use_rfc4122_namespaced_uuids option to true.

但是,补丁是最新的,可能仍在测试中。人们可能会担心它会破坏东西。检查

https://github.com/rails/rails/issues/37681 https://github.com/rails/rails/pull/37682/files

同时,解决方法是打包命名空间字符串

ns=n.scan(/(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})/).flatten.map { |s| s.to_i(16) }.pack("NnnnnN")

在你的例子中

irb(main):037:0> n='e90bf6ab-f698-4faa-9d0f-810917dea53a'
=> "e90bf6ab-f698-4faa-9d0f-810917dea53a"
irb(main):038:0>  ns=n.scan(/(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})/).flatten.map { |s| s.to_i(16) }.pack("NnnnnN")
=> "\xE9\v\xF6\xAB\xF6\x98O\xAA\x9D\x0F\x81\t\x17\xDE\xA5:"
irb(main):039:0> puts Digest::UUID.uuid_v5(ns, 'e90bf6ab-f698-4faa-9d0f-810917dea53a')
6c569b95-a6fe-5553-a6f5-cd871ab30178

关于ruby-on-rails - Rails Digest::UUID v5 (vs) Postgresql uuid-ossp v5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55174609/

相关文章:

node.js - 后端容器无法连接到数据库 - Sequelize、Node、Postgres、Docker

python - 基于 python 的 webapp 中的并发处理

database - 手动为 hibernate UUID 赋值

java - 带耳机的蓝牙安卓服务器客户端

ruby-on-rails - 来自 stdlib 的 Ruby 单例。如何杀死一个实例

ruby-on-rails - 如何为 ToyStore 模型构建观察者?

postgresql - 如何在postgresql中获得比给定字符大的最接近字符?

java - 用于功能日志记录的恒定 UUID(设计)

ruby-on-rails - ActiveAdmin::Devise::SessionsController#create 中的 ArgumentError

ruby-on-rails - request.env ['omniauth.auth' ] 在 Ruby on Rails 中为零