如何在ruby中基于字符串生成非随机UUID?

时间:2018-12-14 14:20:30

标签: ruby-on-rails

由于我们在ruby中具有多线程环境,因此需要基于相同的输入字符串JOB_userId_jobId(如JOb_1_90),每次生成相同的UUID(如9f54c0ae-f9cf-46ba-985d-637e1dcc0e5d)。

示例: "JOb_1_96"=>"412ce9ff-fb47-4b8e-94c9-4bd37481cb4b", "JOb_1_97"=>"7232e1d6-422e-4d49-a47f-f4628e4ffd57", "JOb_1_98"=>"de932dbd-76e4-4828-8bc1-cebd8254db61", "JOb_1_99"=>"ce1e91a3-8d5d-47f8-9dc6-58790cbb98e9", ....

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

据我了解,UUID不应是随机的,而应基于输入字符串。这称为“版本3”和“版本5” UUID。这些版本因使用的哈希函数不同而不同:MD5与SHA1。参见rfc4122, section 4.3

如果您不介意将Activesupport依赖项包含到您的项目中(它是一个很大的宝石,但是很流行并且包含在Rails中),则可以使用其uuid_v3uuid_v5 methods

require "active_support/core_ext/digest/uuid"
puts Digest::UUID.uuid_v3("ae279f4c-6327-47c6-b53c-05a3f10dd0c6", "bar")
puts Digest::UUID.uuid_v5("ae279f4c-6327-47c6-b53c-05a3f10dd0c6", "bar")

输出(请注意,每次运行都相同,与随机UUID不同):

fab2e5c9-bf64-39d4-bc17-e72ccdb013aa
15c252d7-fd16-52de-aac2-223a58aa6ea9