我有一个来自MD5 JAVA方法的16字节数组。我想把它转换成一个长整型的hashkey。我读一个按位异或的位到64是一个好主意…那么怎样才能从中获得更长的收益呢?完整的XOR和cvt的代码示例,请长。
发布于 2012-03-12 10:58:09
我找到的最好的解决方案(基于我的需求...混合速度和良好的散列函数)是谷歌的CityHash。输入可以是包括MD5结果的任何字节数组,并且输出是无符号64位长。
CityHash的散列分布非常好,但并不完美,而且速度非常快。
我在半小时内将CityHash从C++移植到C#。Java端口也应该很简单。
只是XORing比特并不能给出一个很好的分布(尽管无可否认,这会非常快)。
我对Java还不够熟悉,无法确切地告诉您如何从字节数组中填充long (可能有一个我不熟悉的好帮手,或者我可能弄错了Java中的一些算术细节)。不过,从本质上讲,您会想要这样做:
long a = md5[0] * 256 * md5[1] + 256 * 256 * md5[2] + 256 * 256 * 256 * md5[3];
long b = md5[4] * 256 * md5[5] + 256 * 256 * md5[6] + 256 * 256 * 256 * md5[7];
long result = a ^ b;请注意,我没有尝试处理endianness。但是,如果您只关心一致的散列值,那么字节序应该无关紧要。
发布于 2013-10-18 06:42:59
芭乐有一些非常好的Hashing capabilities
Hashing.md5().hashString(s).asLong();我相信上面的代码实际上是CityHash的,但不管怎样,它都会生成散列长度,你可以根据你的散列需求来使用它。(我尝试了@Eric J. Java代码,它看起来像CityHash 32)。
发布于 2012-03-14 01:41:16
为了清楚起见,加密摘要的任何部分都不再具有摘要的许多加密属性,特别是这些属性不再成立:
反转电阻(找到满足H(X))
https://stackoverflow.com/questions/9661227
复制相似问题