【问题标题】:Can hash algorithm such as MD5/SHA-1 generate an ID with less probability of collision than pure random number?MD5/SHA-1等哈希算法能否生成比纯随机数碰撞概率更小的ID?
【发布时间】:2018-07-09 02:54:33
【问题描述】:

我有一个应用程序,它使用哈希算法(当前为 MD5)在数据库表中生成唯一 ID。哈希是根据行的某些字段计算的,但不会检查该计算,因为稍后更改这些字段时,该行的 ID 不会更改。

现在我想更改代码以添加一些新功能,同时为 ID 生成一个纯随机数可以大大简化我的工作(要说明为什么我之前生成该 ID 要容易得多,这是一个很长的故事我能够获取哈希算法的所有必要字段的内容)

我知道通常编程语言自己的随机生成器会生成伪随机数,但我使用的是 Python 的 random.SystemRandom(),它使用了操作系统的密码学级别的“真”随机生成器,所以我认为应该是一样的与使用哈希算法生成 ID 的碰撞概率。

我的理解正确吗?如果不是,为什么?

【问题讨论】:

  • 您的项目需要随机性还是唯一性?
  • @Klaus D.,不,随机性不是我的项目的要求。我只需要唯一性。并且没有全局序列生成器,所以我必须使用哈希算法或随机数。当前的实现使用了根据某些字段的内容计算的 MD5 哈希算法,但我想将其更改为简单地使用随机数,因为在我的新实现中生成 ID 时很难获取这些字段。跨度>
  • UUIDs,更准确地说是UUID1,就是为此目的而制作的。只需确保每个节点的节点值是唯一的,并且在每个节点使用多个进程时也是每个进程。

标签: python random md5 uuid


【解决方案1】:

生成 X 个字节的随机数据给出的碰撞概率与在某些 ID 上使用散列函数完全相同......

假设...

  1. 您使用哈希函数的列本身是唯一的。
  2. #1 你没有犯错

我建议使用系统的加密随机数提供程序。因为你可能犯了错误。这是一个简单的:

您的系统:连接第 1 列和第 2 列,并对结果进行哈希处理。您可以保证您永远不会再对第 1 列和第 2 列的值执行此操作。从来没有。

什么时候:

  1. 第 1 列 = “abc”
  2. 第 2 列 = "def"

  1. 第 1 列 = “ab”
  2. 第 2 列 = “cdef”

这些将创建相同的哈希函数。

那么你会更信任谁给你随机数据?你自己?还是一个操作系统开发人员团队,包括密码学专家和数十年的研究和经验? :)

使用系统的加密随机函数。

【讨论】:

  • 谢谢,这让我对我的新实施更有信心。谢谢。
  • 当然,除非您希望生成的 ID 可重现。虽然我喜欢你不信任的哲学,但这可能会导致数据管道中出现其他问题。
猜你喜欢
  • 2014-04-18
  • 2013-09-08
  • 1970-01-01
  • 2011-08-17
  • 2011-11-19
  • 2020-11-02
  • 2015-04-23
  • 2013-05-30
  • 2018-12-10
相关资源
最近更新 更多