【问题标题】:Rails Digest::UUID v5 (vs) Postgresql uuid-ossp v5Rails Digest::UUID v5 (vs) Postgresql uuid-ossp v5
【发布时间】:2019-03-15 02:11:18
【问题描述】:

使用 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"

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,但它是不同的!

【问题讨论】:

    标签: ruby-on-rails postgresql uuid


    【解决方案1】:

    这不是关于为什么 Rails 会产生不同结果的问题的答案,但如果您想在 Ruby 代码中产生 v5 UUID,您可以使用uuidtools。它返回与 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)>
    

    【讨论】:

      【解决方案2】:

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

      • 新行为将通过将config.active_support.use_rfc4122_namespaced_uuids 选项设置为 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 2014-09-13
        相关资源
        最近更新 更多