Algorithm 随机数应该有多宽,所以实际上不可能重复其中两个?

Algorithm 随机数应该有多宽,所以实际上不可能重复其中两个?,algorithm,random,language-agnostic,Algorithm,Random,Language Agnostic,某些系统应该生成具有唯一ID的对象。该系统将在不同的计算机上运行,而它们之间没有连接;但不会发生ID冲突。实现这一点的唯一方法是生成随机数。那些东西应该有多宽,所以你可以认为碰撞是不可能发生的吗? guid使用2^128,碰撞的可能性可以忽略不计这基本上是对 可以帮助您计算出需要多少位才能达到所需的概率-基于p-所需的概率,以及将被“散列”(生成)的#元素。您在问题中提到: 实现这一点的唯一方法是生成随机数 不,这不是唯一的方法。事实上,这是做这件事的方法之一 现在已经有一种广为人知且被广泛使用

某些系统应该生成具有唯一ID的对象。该系统将在不同的计算机上运行,而它们之间没有连接;但不会发生ID冲突。实现这一点的唯一方法是生成随机数。那些东西应该有多宽,所以你可以认为碰撞是不可能发生的吗? guid使用2^128,碰撞的可能性可以忽略不计

这基本上是对


可以帮助您计算出需要多少位才能达到所需的概率-基于
p
-所需的概率,以及将被“散列”(生成)的
#元素。

您在问题中提到:

实现这一点的唯一方法是生成随机数

不,这不是唯一的方法。事实上,这是做这件事的方法之一

现在已经有一种广为人知且被广泛使用的方法来做类似的事情,您自己也在使用这种方法:添加前缀(或者后缀,没关系)。前缀被许多系统称为很多东西:以太网和WiFi称之为供应商id。在TCP/IP中,它被称为子网(技术上称为“网络”)

这个想法很简单。比如说,你想用一个32位的数字作为你的全局id。保留8位来识别它在哪个系统上,其余的可以是每个系统中的序列号

暂时从IPv4中窃取语法。假设系统1的id为1。系统2的id为2。因此,来自系统1的ID将在1.0.0.0-1.255.255.255之间,来自系统2的ID将在2.0.0.0-2.255.255之间

这只是一个例子。并没有什么能强迫你们为系统id浪费这么多比特。事实上,IPv4本身不再是按字节边界组织的。您可以改为使用4位作为系统id,使用28位作为单个id。如果您需要更多id,也可以使用64位,或者使用IPv6路由并使用128位(在这种情况下,您完全可以为系统id浪费一两个字节)

因为每个系统不能生成由另一个系统生成的id,所以在id溢出之前不会发生冲突


如果需要ID看起来“随机”,请使用哈希算法。如果数据的大小固定在散列大小之下,则SHA1和CRC等好的散列算法保证不会发生冲突。例如,SHA1是160位,因此如果您的id生成系统内部小于160位,则id的SHA1哈希将永远不会冲突。需要注意的是,您必须使用所有160位。旋转SHA1将导致碰撞。对于32位ID,CRC32是一个完美的选择,而如果您想生成64位ID,还可以使用CRC64。

听起来您在描述被认为“几乎不可能”的大量情况下的GUI is 1?如果你定义了你可以接受的概率,那么应该可以给你答案。JF Sebastian是一个理想主义者,你正在寻找一个实用的答案。
实现这一点的唯一方法是生成随机数
-你能解释一下原因吗?例如,序列号有什么问题?如果每台计算机都有一个唯一的ID,那么这两台计算机可以结合在一起形成一个全局唯一的值,这基本上就是UUID/GUID的作用。随机性与来自机器标识的恒定数据相结合,以确保唯一性。为了避免cargo cult编程,理解工具背后的一些概念可能是有用的,而不仅仅是盲目使用它们。特别是,了解碰撞概率以及如何计算碰撞概率可能会有所帮助。@J.F.Sebastian他确实将我与那篇文章联系起来,这篇文章包含了我需要学习的一切。只是忘记了这个特别的答案。你认为系统有唯一的ID,事实并非如此。为什么不是这样?