问题描述
|
我们对一个使用唯一ID值的系统进行了研究,我们要与之共享信息的另一家公司将不接受该ID。我当时正在考虑使用一种类似于密码的单向加密哈希。问题在于,如果输入保证唯一并且盐恒定,那么哈希算法创建的输出值是否可以保证唯一?
解决方法
答案是肯定的。具有相同盐的相同id输入将始终产生相同输出。
但是,如果您的问题是要保证输出始终唯一,那么答案是否定的。即使输入不同且盐常数不变,散列将两次产生相同的输出的统计概率非常小。
,原则上,如果输入大小大于输出大小,则没有没有冲突的哈希算法。 (在您的情况下,相关的输入大小将是该部分的大小,它从一个输入变为另一个输入。)
对于较短的输入,是否也存在冲突是哈希算法的一个属性,但是其思想是,发生冲突的可能性应该很小(对于一个好的算法,每对输入对大约为(1 /(2 ^输出大小))) 。
,您的问题是两个不同的值可以散列到同一事物还是散列是确定性的?
如果是前者,则是,您可能会遇到哈希冲突。设计良好的密码学强哈希应该使很难找到两个值哈希成相同的值,也很难找到与给定哈希匹配的输入,但是它们不能保证唯一性。
信鸽负责人:
如果您的哈希值是恒定大小,例如64位(不失一般性),则您最多将具有2 ^ 64个唯一的输出哈希值。如果您使用的是字符串,则可能有2 ^ 64个以上的潜在输入,因此在您的哈希最多2 ^ 64 + 1个项目之后,可以确保发生冲突。
,是的,当输入和盐相同时,将产生相同的哈希。请注意,不同的输入可能会产生相同的哈希。
,简而言之,没有。更长的答案是“ 0”将能够解决您提出的问题。由于没有人证明完美甲骨文的存在,因此目前认为这是不可能的。另一方面,这是不可能的,就是作为一个集体,我们没有足够的智慧来解决这个问题。类似于P!= NP