【问题标题】:Is there a SHA that's guaranteed to produce a unique hash?是否有保证产生唯一哈希的 SHA?
【发布时间】:2019-02-03 18:12:27
【问题描述】:

我正在寻找一种方法来对从 3rd 方服务获得的用户 ID 进行哈希处理,以便我可以将哈希用作主键。

我的理解是,通常的SHA-512 风格算法,给定一个保证唯一的输入字符串,不能保证产生一个也保证唯一的哈希值。

是否有可以产生唯一哈希的哈希算法?

更具体地说,NodeJS 10.9 或更高版本是否支持开箱即用的算法

【问题讨论】:

  • 鉴于典型哈希算法的范围是有限的,而您可以输入无限多的输入,因此很难获得“唯一”哈希。当然,实际上从两个随机输入字符串中发生冲突的可能性很小,除非您有目的地尝试找到冲突,否则它可能不会发生。
  • 我想,满足您要求的任何此类散列函数的输出都将与您的输入长度成比例,因为输入集必须与输出集一对一.
  • 根据定义,哈希具有非零的冲突概率,因此不能保证它是唯一的。如果您想要唯一性保证,那么您将需要使用哈希以外的其他东西,例如加密用户 ID 或类似的东西,并且它必须随着输入的长度而缩放。如果您愿意处理概率(而不是保证),那么您可能会找到一个具有足够低的非唯一性概率的哈希,但究竟什么会起作用取决于您没有共享的许多细节和要求。
  • 512 位是很多位...查看this relevant question 的 SHA-256,然后考虑 SHA-512 的空间是 平方

标签: node.js encryption sha cryptojs


【解决方案1】:

SHA-512 散列的长度为 64 字节(512 位)长,它为您提供 10154 个值组合。所以它获得相同哈希的机会非常少(我的意思是非常非常少)。

要少得多,以克为单位考虑太阳的重量(它的重量是足弓的百万倍)。如果任何其他行星的重量为 10154 克,那么即使是数百万个太阳的总和也无法达到这个数量。

所以非常少,这意味着永远。甚至比特币地址也使用这种方法作为钱包地址。如果你有任何机会能找到一个组合,你将成为亿万富翁。我保证

【讨论】:

  • 我认为您打算在第一句话中写 512 位。
  • @LukeJoshuaPark 是的,谢谢
  • @DaveSag 如果散列输出是一致的,那么该理论将保持不变,但事实并非如此。 michiel.buddingh.eu/distribution-of-hash-values 不管怎样 - 恕我直言,SHA-256 的冲突概率可以忽略不计,但原则上不保证是唯一的
  • 谢谢,是的,我非常有信心 SHA-512 将满足我的需求。碰撞的商业影响实际上非常小,因此值得承担微小的风险。
【解决方案2】:

大多数哈希算法都在尽力避免冲突。 SHA 512 应该适合您,如果不是 SHA 256。请注意,如果您可以在输入数据中看到冲突,那么哈希中就会存在冲突,在这种情况下,我建议附加一些可能对两个单独帐户唯一的东西 - 例如作为它们创建的时间戳 - 在将值输入哈希之前。只要两个输入都是不可变的并且它们永远不会在帐户上更改,这将工作得很好。

您可以使用crypto.getHashes() 查看可用的哈希值并选择您想要的哈希值。您要求的是唯一性而不是安全性,所以越快越好。

这个答案也相关: When using SHA-256 hashes as a primary key, is it OK to ignore the possibility of collisions?

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2011-02-15
    • 2017-10-31
    相关资源
    最近更新 更多