将 MD5 转换为长整型

Ala*_*sen 3 java bit-manipulation xor long-integer

我有一个来自 MD5 JAVA 方法的 16 字节数组。我想将其转换为 long 以用作哈希键。读取按位 XOR 到 64 的位是一个好主意...那么如何从中获得 long 呢?XOR 和 cvt 的完整代码示例请较长。

Eri*_* J. 5

我发现的最好的解决方案(根据我的需要......速度和良好的哈希函数的组合)是 Google 的CityHash。输入可以是包括 MD5 结果的任何字节数组,输出是无符号 64 位长。

CityHash 具有非常好的但不完美的哈希分布,并且速度非常快。

我在半小时内将 CityHash 从 C++ 移植到 C#。Java 端口也应该很简单。

仅对位进行异或并不能给出良好的分布(尽管不可否认这会非常快)。

我对 Java 不太熟悉,无法准确地告诉您如何从字节数组中填充 long(可能有一个我不熟悉的好帮手,或者我可能会错误地得到 Java 中算术的一些细节)。但本质上,你会想做这样的事情:

long a = md5[0] + 
         256 * md5[1] + 
         256 * 256 * md5[2] + 
         256 * 256 * 256 * md5[3] + 
         256 * 256 * 256 * 256 * md5[4] + 
         256 * 256 * 256 * 256 * 256 * md5[5] +
         256 * 256 * 256 * 256 * 256 * 256 * md5[6] +
         256 * 256 * 256 * 256 * 256 * 256 * 256 * md5[7];

long b = md5[8] + 
         256 * md5[9] + 
         256 * 256 * md5[10] + 
         256 * 256 * 256 * md5[11] + 
         256 * 256 * 256 * 256 * md5[12] + 
         256 * 256 * 256 * 256 * 256 * md5[13] +
         256 * 256 * 256 * 256 * 256 * 256 * md5[14] +
         256 * 256 * 256 * 256 * 256 * 256 * 256 * md5[15];

long result = a ^ b;
Run Code Online (Sandbox Code Playgroud)

请注意,我没有尝试处理字节顺序。不过,如果您只关心给定平台上一致的哈希值,则字节顺序并不重要。