我想将MD5摘要从32个字符减少到理想的16个字符。我将其用作数据库密钥来检索一组(公共)用户定义的参数。我期望唯一的“ ID”的数量最终将超过10,000。冲突是不可取的,但不是世界末日。
我想了解MD5摘要的天真截断以实现较短密钥的可行性。但是我在挖掘一个我可以理解的公式时遇到了麻烦(假设我的数学背景有限),更不用说确定截断哈希对碰撞概率的影响了。
在合理范围内,越短越好。我觉得必须有一个简单的公式,但我希望有一个明确的答案,而不是将我自己的猜测与从网上阅读的点点滴滴拼凑在一起。
答案 0 :(得分:0)
您可以使用以下公式计算发生碰撞的可能性:
chance of collision = 1 - e^(-n^2 / (2 * d))
其中n
是消息数,d
是可能性数,e
是常数e
(2.718281828 ...)。
答案 1 :(得分:0)
我发现了一些其他的或多或少准确和/或简化的here方程,以及一个很好的解释和一个现实世界中概率的便捷比较:
......,其中k
是您将生成的ID的数量(“消息”),而N
是哈希摘要可以生成的最大数量或最大数量截断的十六进制数字可以表示(技术上为+1,代表0)。
例如,如果原始哈希为“ 38BF05A71DDFB28A504AFB083C29D037”(32个十六进制字符),并且将其截断为12个十六进制字符(例如:“ 38BF05A71DDF”),则您可以生成的最大十六进制数为“ 0xFFFFFFFFFFFFFF”(281474976710655-它是16 ^ 12-1(如果您更喜欢以字节为单位考虑,则为256 ^ 6)。但是由于“ 0”本身就算作理论上可以产生的数字之一,因此您应加上1,只剩下16 ^ 12。
因此,您可以将N
视为16 ^(numberOfHexDigits)。