哈希算法如MD5/SHA-1是否能够生成比纯随机数更低碰撞概率的ID?

3
我有一个应用程序,使用哈希算法(目前是MD5)在数据库表中生成唯一ID。该哈希基于行的某些字段计算得出,但没有检查该计算,因此当稍后更改这些字段时,该行的ID不会更改。
现在我想更改代码以添加一些新功能,而为ID生成纯随机数可以极大地简化我的工作(长话短说,这就是为什么在能够获取所有必要字段内容之前生成该ID对我来说更容易的原因)
我知道通常编程语言自己的随机生成器会生成伪随机数,但我正在使用Python的random.SystemRandom(),它使用了操作系统的加密级别的“真”随机生成器,因此我认为它与使用哈希算法生成ID相比,应该具有相同的碰撞概率。
我的理解正确吗?如果不是,为什么?

你的项目需要随机性还是仅需要唯一性? - Klaus D.
@Klaus D. ,不,随机性并不是我项目的要求。我只需要唯一性。而且没有全局序列生成器,所以我必须选择哈希算法或随机数。当前实现使用从某些字段的内容计算出的MD5哈希算法,但我想将其更改为简单地使用随机数,因为在我生成新实现中的ID时很难获取那些字段。 - Vespene Gas
1
UUIDs,更确切地说是UUID1,是为此目的而制作的。只需确保每个节点的节点值是唯一的,并且在每个节点使用多个进程时,每个进程也是唯一的。 - Klaus D.
1个回答

2
生成X个字节的随机数据与使用哈希函数对某些ID进行哈希具有完全相同的碰撞概率...
假设...
1.您使用哈希函数的列本身是唯一的。 2.您没有在第1步中犯错误。
我建议使用系统的加密随机数提供程序。因为您可能已经犯了错误。下面是一个简单的例子:
您的系统:连接列1和列2,然后对结果进行哈希。您可以保证永远不会再次对那些列1和列2的值执行此操作。从不。
那么当:
1.列1 =“abc” 2.列2 =“def”

1.列1 =“ab” 2.列2 =“cdef”
时,它们将创建相同的哈希函数。
那么你更信任谁给你随机数据?你自己?还是一个由操作系统开发人员,包括密码学专家和几十年的研究和经验组成的团队? :)
选择系统的加密随机函数。

谢谢,这让我更有信心使用我的新实现。谢谢。 - Vespene Gas
当然,除非您希望生成的ID可再现。虽然我喜欢您的自我不信任哲学,但这可能会在数据管道中引起其他问题。 - Roman

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