Java 如果相同的salt用于唯一的输入,哈希算法是否保证唯一的输出?

Java 如果相同的salt用于唯一的输入,哈希算法是否保证唯一的输出?,java,encryption,hash,Java,Encryption,Hash,我们有一个系统视图,该系统使用一个值作为唯一id,我们希望与之共享信息的另一家公司将不接受该id。我正在考虑使用一种单向加密散列,类似于对密码所做的操作。问题是,如果输入是唯一的且salt是常量,那么哈希算法创建的输出值能否保证唯一 答案是肯定的。相同的id输入和相同的salt将始终产生相同的输出 但是,如果您的问题是关于确保输出始终是唯一的,那么答案是否定的。即使输入不同且salt常数相同,哈希将创建相同输出两次的统计概率也很小。是的,当输入和salt相同时,将生成相同的哈希。请注意,不同的输

我们有一个系统视图,该系统使用一个值作为唯一id,我们希望与之共享信息的另一家公司将不接受该id。我正在考虑使用一种单向加密散列,类似于对密码所做的操作。问题是,如果输入是唯一的且salt是常量,那么哈希算法创建的输出值能否保证唯一

答案是肯定的。相同的id输入和相同的salt将始终产生相同的输出


但是,如果您的问题是关于确保输出始终是唯一的,那么答案是否定的。即使输入不同且salt常数相同,哈希将创建相同输出两次的统计概率也很小。

是的,当输入和salt相同时,将生成相同的哈希。请注意,不同的输入可能会产生相同的散列。

原则上,如果输入大小大于输出大小,则没有无冲突的散列算法。(在您的情况下,相关输入大小将是从一个输入更改为下一个输入的此零件的大小。)


对于较短的输入,是否也存在冲突是哈希算法的一个特性,但其思想是,对于一个好的算法,每对输入,这些冲突的概率应该非常小(大约为1/(2^输出大小)。

您的问题是,两个不同的值可以对同一事物进行哈希,还是哈希是确定性的

如果是前者,那么是的,可以有散列冲突。一个设计良好的加密强散列应该很难找到两个散列为相同值的值,或者很难找到与给定散列匹配的输入,但它们不能保证唯一性

鸽子洞负责人:
如果您的散列是一个恒定的大小,比如说64位(不丧失通用性),您最多将有2^64个唯一的输出散列值。因为如果您使用的是字符串,则可能会有2^64个以上的输入,所以在散列最多2^64+1个项目之后,保证会发生冲突

简言之,答案是否定的。
完美的oracle将能够解决您提出的问题。因为从来没有人证明过完美的甲骨文的存在,所以目前认为这是不可能的。另一方面,这并不是说我们作为一个集体没有足够的智慧来解决这个问题是不可能的。类似于P!=谢天谢地,这个问题比我的描述更清楚。谢谢你回答这两个问题。我的需求是确保输出的唯一性,因为输入是唯一的。如果对值进行散列会消除这种保证的唯一性,那么这将不起作用。即使发生碰撞的可能性极小。具有guid映射的解析表看起来像是没有乐趣的解决方案。我希望避免存储任何数据。@马克:如果你想要一个可逆函数,你需要的是加密而不是散列。如果您不介意它是否可逆,那么您只需要寻找从源ID范围到目标ID范围的任何内射函数。