压缩SHA-256哈希

时间:2012-10-19 13:09:17

标签: java serialization sha

我想自动生成Java的serialVersionUID(长或64位)。要序列化的对象的区别在于大约20个整数,但不总是20个整数。我打算将整数转换为逗号分隔的数字字符串,并通过SHA-256哈希函数运行它。

由于SHA-256是32字节长(256位),我需要它适合serialVersionUID(64位),我怎么能将它转换为64位值并最大限度地减少一个好的特性的损失散列?

5 个答案:

答案 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个字符。