SecureRandom.uuid与UUID gem的区别

13

ruby的SecureRandom.uuid (Ruby 1.9.3)和UUID gem之间有什么区别吗? UUID gem是以前的做法吗?

从文档中我发现,gem更“安全”,可以生成真正独特的UUID,而SecureRandom.uuid则更像一个随机字符串,可能不是唯一的概率更大。此外,UUID似乎允许基于文件的持久性来协助实现这一点。

所以,我希望能听到比我更有见地的人的意见。


"更大的机会"是非唯一的可能性在实践中高度不太可能发生。我认为UUID gem是v1 uuid,这里有一些相关但不是答案的模糊内容:https://dev59.com/3nRB5IYBdhLWcg3wJkhC#786541 - Neil Slater
2
那实际上相当好地回答了这个问题。Ruby版本是v4,而gem是v1。使用ruby的方法遇到两个相同的UUID的概率非常小。在我的设置中,使用v1实际上是零(除非我生成了256 exobytes的uuids)。“坦白地说,在没有恶意行为者的单个应用程序空间中,即使您每秒生成相当多的UUID,即使是版本4 UUID,所有生命的灭绝也会比您发生碰撞早很长时间。” - Dmitriy Likhten
1
同时v1 UUID依赖于MAC地址的唯一性。在一个高度虚拟化的世界中,你可能会惊讶地发现,虚拟网络适配器的MAC地址的唯一性可能不如从OpenSSL::Random获取的随机位强有力的保证。 - dbenhur
@dbenhur:很有趣。谢谢。这个问题是否应该关闭,因为它似乎更像是一次对话? - Dmitriy Likhten
1个回答

9
有几种方法可以生成UUID。
维基百科列出了这些方法。 http://en.wikipedia.org/wiki/Universally_unique_identifier v4 UUID:
随机数的关键思想是,与加密相关时实际上很难生成。大多数随机数生成器都是一个数学公式,只需要看起来随机即可,对于大多数应用程序而言这已经足够了。许多程序将使用$pid | time来生成随机种子。
这并不是非常可靠...我知道请求生成的时间,只有65,534个pid。从中我可以推出随机种子。
因此,如果您在100台带有PID编号的机器上同时(同一秒)使用$pid | time()进行UUIDv4号生成器种子生成,则有(我猜)100/65536的重复概率。可以像这样轻松完成:
for MACH in `cat machine_list`; do ; ssh $MACH -c "restart something" & ; done

SecureRandom:

SecureRandom的代码会尝试使用openssl、/dev/urandom和win32等方式生成随机数...

从/dev/urandom中读取数据时,数据非常随机,但如果系统中没有足够的混沌因素,urandom将会虚构数据来提供随机数据。从/dev/random中读取数据时,数据非常非常随机,如果系统中没有足够的混沌因素,/dev/random将会阻塞。

UUID:

The UUID gem uses rand()

   r = [rand(0x100000000)].pack "N"

获取 MAC 地址。

UUID 也不能提供 v4 UUIDs :)

实际上,如果我曾经遇到 md5 或 uuid 冲突,那我就会去买彩票!


1
虽然这篇文章涉及JavaScript随机数生成器,但它是一篇非常信息丰富的关于“随机”UUID问题的文章。https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.k2ah5kjq1 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接