"UUIDv4 generation libaries"与"just rolling your own with random hex characters or bits"之间的差异



根据维基百科,关于UUID4的组成主题。。。

版本4 UUID的格式为xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxx其中x是任何十六进制数字,y是8、9、A或B 之一

因此,我可以想到程序员可以使用三种可能的方法来生成随机UUID4:

方法a)使用已存在的"正确"UUID4生成库

-或-

方法B)只需在字符串上使用随机十六进制字符就可以自己滚动:

  • 以字符串"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxx"开头
  • 将"x"字符替换为随机十六进制字符(0-9a-f)
  • 将"y"替换为以下任意一项:8 9 a b

上面的步骤只是一个简单的例子,说明如何将其作为字符串来完成。请考虑对字符串和随机选择的十六进制字符进行操作的任何其他方法仍然是"MethodB",例如从空字符串开始,一次添加一个字符。

-或-

方法C:使用逐位操作进行滚动:

我想大多数图书馆都是这样做的吧?主要使用随机位,同时确保"4"one_answers"8/9/a/b"在最终生成的字符串中。

问题:

Q1:从技术上讲,所产生的UUIDv4在随机性或与存储UUIDv4的数据库等的总体兼容性方面是否存在任何差异?

Q2:使用方法#2(随机十六进制字符)而不是#1或#3(按位)有什么缺点吗?

Q3:除了MethodB和MethodC中的简单方法之外,MethodA中的"适当"UUIDv4生成库是否做了一些特别的事情?

Q4:有什么方法更容易遇到冲突吗?

问题5:MethodB+MethodC生成的结果UUID是否完全符合UUIDv4规范(即使它们的方法不符合)。

注:

  • 此问题仅适用于UUID版本4
  • 显然,只使用库更容易,我只是想了解结果生成的UUIDv4结果的差异,而不是程序员投入的工作量
  • 我也不太关心上述问题的表现。但如果你对此也有任何评论,那可能也很有趣。我认为库在性能方面更好

Q1:从技术上讲,由此产生的UUIDv4是否存在任何差异将根据其随机性或一般性生成与将存储UUIDv4的数据库等的兼容性?

从技术上讲,没有区别。

Q2:使用方法#2(随机十六进制字符)有什么缺点吗超过#1或#3(按位)?

没有缺点;不是真的。

Q3:MethodA中的"正确"UUIDv4生成库是否正在执行除了MethodB和卫理公会这么做吗?

图书馆通常完全按照MethodC所暗示的

Q4:有什么方法更容易遇到冲突吗?

不是。

问题5:MethodB+MethodC生成的结果UUID是否完全符合UUIDv4规范(即使它们不是在方法上符合要求)。

是的。

成功生成(RFC 4122变体)版本4 UUID并不复杂;但需要对随机数生成有一些了解。例如,"伪随机"数字生成与"加密"质量随机数字生成之间的差异。

例如,一个非常简单的"伪随机"数生成器通常会产生相同的"随机"数的精确序列;这通常非常令人讨厌,以至于可以引入"种子"来改变随机数序列。

当然,每次调用UUID生成器时生成相同的UUID也很烦人。因此,"伪随机"数字生成器不适合生成UUID。

"加密"质量的随机数可能更随机,并且被大多数UUID版本4生成器使用。

简而言之,最好的UUID版本4生成器是基于最好的随机数生成器的生成器。RFC 4122的4.4节给出了如何实现更高程度的UUID版本4随机性的建议。

有一个COMB UUID是从RFC 4122变体派生而来的,您可能对此感兴趣。

--奖金:你可能想看看Mahonri Morianumer的UUID和GUID生成器和取证页面。它使用加密质量的随机数生成器来生成版本4的UUID。

相关内容

最新更新