Ala*_*sen 3 java bit-manipulation xor long-integer
我有一个来自 MD5 JAVA 方法的 16 字节数组。我想将其转换为 long 以用作哈希键。读取按位 XOR 到 64 的位是一个好主意...那么如何从中获得 long 呢?XOR 和 cvt 的完整代码示例请较长。
我发现的最好的解决方案(根据我的需要......速度和良好的哈希函数的组合)是 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)
请注意,我没有尝试处理字节顺序。不过,如果您只关心给定平台上一致的哈希值,则字节顺序并不重要。