我想自动生成Java的serialVersionUID (很长,或64位)。序列化对象的区别是由大约20个整数决定的,但并不总是由20个整数决定。我打算将整数转换为逗号分隔的数字字符串,并通过SHA-256散列函数运行它。
由于SHA-256是32字节长(256位),我需要它来适应serialVersionUID (64位),我如何才能将它转换为64位值,并最大限度地减少好的散列特征的损失?
发布于 2012-10-19 21:13:56
去掉多余的部分就行了。没有必要把事情复杂化。如果有比只取第一个(或任何其他) 64位更好的方法,那么散列就会首先被破坏。
发布于 2012-10-19 21:58:31
首先,您不太可能在正常意义上压缩一个好的哈希。压缩是一种减少冗余的可逆编码。在一个好的哈希中,应该没有要减少的冗余,因此压缩将是无效的。
由于SHA-256是32字节长(256位),我需要它来适应serialVersionUID (64位),我如何才能将其转换为64位值,并最大限度地减少好的哈希特征的损失?
那么这些好的特征是什么呢?好的哈希的主要特征是,它是不切实际的反转它;即,它是不切实际的计算出一个可能的输入,导致哈希。并且相关的特征是,给定产生给定散列的已知输入,产生给出相同散列的另一输入(即冲突)是不切实际的。
现在,当您从256位散列转换为64位散列时,您可以更容易地反转散列或为散列产生冲突……用蛮力。基本上,64位散列意味着在2^64中,任何随机输入都有一个给定的散列。这种可能性足够大,以至于一些拥有足够核心的“坏人”有足够的成功机会(在合理的时间内),使暴力破解成为一个合理的选择。
但这真的很重要吗?有人会通过创建冲突的serialVersion字符串来实现什么?这些字符串不是秘密的,它们不会告诉您任何关于对象的API的明确信息……
底线是,如果这些简化的散列被用作serialVersion字符串,那么(例如)仅使用SHA-256散列的前64位将不会有任何问题。不需要XOR或校验和或做任何其他更复杂的转换。
发布于 2012-10-19 21:16:04
您可以计算SHA-256摘要的循环冗余校验(CRC)。
https://stackoverflow.com/questions/12974964
复制相似问题