我需要知道在散列国内(10位数)和国际(15位)电话号码时是否会发生生日碰撞。
“不应该”!=不会有
我以为我会使用redis SADD response = 0快速运行一些python到空间中的每个n来告诉我是否发生了碰撞。
现在一个10 ^ n的空间似乎很小,但是当你映射成对比较时,我们处于O(10 ^ n)空间,这是一个计算不好的地方。
我需要一个完美的哈希吗?我希望这些电话号码不可恢复,所以SHA256有优点,但值^ 2 +值+盐或一些这样的可能没问题。在合理范围内,我不关心场的长度。我会加入...但
任何人都知道特定哈希的连续数字组中没有碰撞的证据吗?不是碰撞的概率,而是证据。
非常感谢!
编辑反映它小于n!确实是(10 ^ n)(10 ^ n-1)/ 2所以O(10 ^ n)谢谢DSM
答案 0 :(得分:2)
如果您想要的是每个电话号码都有一个唯一的密钥,您可以简单地使用AES等对称密码术。使用电话号码作为密钥,这可以保证其他电话号码不会产生相同的密码。
生成:“原始文本”----用key = phone_number加密----> “9安培; &安培; Y (&安培; GG(的O& GG(B)H)* H”
验证:“9& & Y (& GG(O& GG(B)H)* H”----用key = phone_number解密---->“原文“
答案 1 :(得分:2)
你预计人们会告诉你"可能"不会发生碰撞,但仍然值得澄清这意味着什么。找到重复SHA2的几率非常低,太阳光或制造缺陷更有可能在CPU中随机翻转。你的程序总是很有可能会疯狂,因此编写围绕概率的代码并不是真的有意义。
你可能会说恶意输入可能会使其更容易发生碰撞。但截至2015年3月,任何输入都没有发现SHA1或SHA2的冲突,当发现任何输入时,这将是一个重大新闻。
@tk。建议使用AES很聪明,所以如果这对你有用,那就很好。但是如果你遇到问题 - 例如,如果你发现自己的密钥长度超过32字节 - 那么回到SHA2就没有错。