Ruby on rails Rails摘要::UUID v5(vs)Postgresql UUID ossp v5

Ruby on rails Rails摘要::UUID v5(vs)Postgresql UUID ossp v5,ruby-on-rails,postgresql,uuid,Ruby On Rails,Postgresql,Uuid,在使用Rails Digest::UUID和Postgresql UUID ossp生成时,我得到了不同的V5 UUID 轨道: [58] pry(main)> Digest::UUID.uuid_v5('e90bf6ab-f698-4faa-9d0f-810917dea53a', 'e90bf6ab-f698-4faa-9d0f-810917dea53a') => "db68e7ad-332a-57a7-9638-a507f76ded93" select uuid_generat

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

轨道:

[58] pry(main)> Digest::UUID.uuid_v5('e90bf6ab-f698-4faa-9d0f-810917dea53a', 'e90bf6ab-f698-4faa-9d0f-810917dea53a')
=> "db68e7ad-332a-57a7-9638-a507f76ded93"
select uuid_generate_v5('e90bf6ab-f698-4faa-9d0f-810917dea53a', 'e90bf6ab-f698-4faa-9d0f-810917dea53a');
           uuid_generate_v5
--------------------------------------
 6c569b95-a6fe-5553-a6f5-cd871ab30178
Postgresql uuid ossp:

[58] pry(main)> Digest::UUID.uuid_v5('e90bf6ab-f698-4faa-9d0f-810917dea53a', 'e90bf6ab-f698-4faa-9d0f-810917dea53a')
=> "db68e7ad-332a-57a7-9638-a507f76ded93"
select uuid_generate_v5('e90bf6ab-f698-4faa-9d0f-810917dea53a', 'e90bf6ab-f698-4faa-9d0f-810917dea53a');
           uuid_generate_v5
--------------------------------------
 6c569b95-a6fe-5553-a6f5-cd871ab30178

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

这并不是关于Rails为什么会产生不同结果的问题的答案,但是如果您想在Ruby代码中产生V5UUID,您可以使用。它返回与PSQL相同的结果:

  ~ pry
[1] pry(main)> require 'uuidtools'
=> true
[2] pry(main)> UUIDTools::UUID.sha1_create(UUIDTools::UUID.parse('e90bf6ab-f698-4faa-9d0f-810917dea53a'), 'e90bf6ab-f698-4faa-9d0f-810917dea53a')

=> #<UUID:0x3fe09ea60dd8 UUID:6c569b95-a6fe-5553-a6f5-cd871ab30178>
[3] pry(main)>
~pry
[1] 撬(主)>需要“UUID工具”
=>正确
[2] pry(main)>UUIDTools::UUID.sha1_创建(UUIDTools::UUID.parse('e90bf6ab-f698-4faa-9d0f-810917dea53a'),'e90bf6ab-f698-4faa-9d0f-810917dea53a')
=> #
[3] 撬动(主)>

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

  • 新行为将通过设置
    config.active\u支持来启用。使用\u rfc4122\u namespaced\u uuids
    选项
    true
但是,这个补丁是最新的,可能还在测试中。人们可能害怕它会破坏东西。检查

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

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

我也想知道这个问题的答案……:)