是否有128个散列算法(无论是加密还是非加密散列)都能保证不会发生冲突?
如果可以保证我的字符串不会超过特定的长度(是否有这样的长度? - 我可以保证长度小于100个字符)
谢谢, J.B
答案 0 :(得分:3)
不,你不能做这样的算法。如果你有一个 100 字符的字符串,你可以(让字符在1..255
范围内)
256**100 == (2**8)**100 == 2**800
不同的字符串(pontential collisions); 128 位散列函数只有2**128
不同的值,
因为
2**128 < 2**800
碰撞是不可避免的:pigeon hole principle
编辑:想象我们有128
位功能;可以无冲突的字符串的最大长度是多少?
256**length = 2**128
(2**8)**length = 2**128
8 * length = 128
length = 16
所以最大长度为16
(为简单起见,我假设该字符串不包含'\0'
)。如果string为unicode one(即在1..65535
范围内有chars)
65536**length = 2**128
(2**16)**length = 2**128
16 * length = 128
length = 8
答案 1 :(得分:0)
您不能通过数学保证不会发生碰撞。
但是您可以保证实用,碰撞的可能性非常低,因此您可以接受。一个示例是randomly generated UUIDs,其中重复的可能性非常低,因此在实践中这不是问题。与content addressable storage相同,通常依赖于加密哈希函数的实用(而非数学)唯一性。
哈希算法对您而言是否足够好取决于您要哈希的项目数以及您可以接受的碰撞几率。然后,您可以使用birthday problem中的公式来计算128位是否足够。