我想自动生成Java的serialVersionUID(长或64位)。要序列化的对象的区别在于大约20个整数,但不总是20个整数。我打算将整数转换为逗号分隔的数字字符串,并通过SHA-256哈希函数运行它。
由于SHA-256是32字节长(256位),我需要它适合serialVersionUID(64位),我怎么能将它转换为64位值并最大限度地减少一个好的特性的损失散列?
答案 0 :(得分:5)
切断额外的位。没有必要使事情复杂化。如果有一种优越的方法来获取第一个(或任何其他)64位,那么哈希就会被打破。
答案 1 :(得分:4)
首先,你不太可能在正常意义上压缩一个好的哈希。压缩是关于可逆编码,可减少冗余。在良好的散列中,应该没有冗余来减少,因此压缩将是无效的。
由于SHA-256是32字节长(256位),我需要它适合serialVersionUID(64位),我怎么能将它转换为64位值并最大限度地减少一个好的特性的损失散列?
那么这些好的特征是什么?好的哈希的主要特征是反转它是不切实际的;即,找出导致散列的可能输入是不切实际的。并且相关的特征是,给定产生给定散列的已知输入,产生给出相同散列的另一输入(即冲突)是不切实际的。
现在,当你从256位散列到64位散列时,你可以使更容易来反转散列或者通过暴力产生哈希的冲突。基本上,64位散列意味着在2^64
中有一次机会,任何随机输入都将具有给定的散列。这个概率足够大,以至于一些拥有足够内核的“坏人”有足够的成功机会(在合理的时间内)使暴力成为合理的选择。
但这真的很重要吗?有人通过创建碰撞的serialVersion字符串来实现什么?这些字符串并不是秘密,它们也没有告诉你关于对象API的任何确定性......
最重要的是,如果这些简化的哈希被用作serialVersion字符串被设计使用,那么(例如)仅使用SHA-256哈希的前64位就不会有任何问题。不需要XOR或校验和或进行任何其他更复杂的转换。
答案 2 :(得分:1)
您可以计算SHA-256摘要的循环冗余校验(CRC)。
答案 3 :(得分:0)
我会说使用64位校验和,或者如果你想坚持使用SHA,那么对64位块进行异或。
答案 4 :(得分:0)
用成熟的160哈希它。
例如
4727c1278432c388eea822904f008468c02fd543fc347391d1f2b9918ec9b5b9
成为
069e298ee9d1b14e7774434624703c0be1a47ee1
即66个字符,减少到40个字符。