在使用 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 totrue
.
但是,补丁是最新的,可能仍在测试中。人们可能会担心它会破坏东西。检查
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/