如何将 64 位哈希值缩短为 48 位值?
How to shorten a 64-bit hash value down to a 48-bit value?
我已经在库中有一个 64 位哈希函数(C 编码),但我只需要 48 位。我需要 trim 将 64 位哈希值降低为 48 位值,但它必须以安全的方式进行,以最大程度地减少冲突。
散列函数是一个很好的64位散列函数。它已经用 SMHasher("DieHarder" 哈希测试)进行了测试,证明比 Murmur2 更好。据我的同事说,在 lib 中实现的用于 64 位哈希的算法是 xxHash,使用 SMHasher 测试并得到了 Q.Score 10!对于那些想看它的人,xxHash 的源代码可以在 github.com : github.com/Cyan4973/xxHash/releases/latest 上找到。
基本思想是让 64 位哈希值中的所有位(或其中的一部分)对生成的 48 位哈希值产生影响。有什么办法吗?
[后期编辑]:
所以我实现了自己的 48 位(准)-UUID 生成器。
请在此处查看完整的工作解决方案(包括源代码):.
hash >>= 16;
但是如果你觉得任意保留其他 16 位更好,只需使用 XOR。
hash = (hash >> 16) ^ (hash & 0xFFFF);
如果64位的hash不错,那么选择任意48位的hash也是不错的。 。当然,信息丢失不可逆
unsigned long long Mask48 = 0xFFFFFFFFFFFFu;
unsigned long long hash48 = hash64 & Mask48;
如果 64 位哈希函数较弱,则 mod 由 pow(2,48)
下方的最大素数。一些桶会丢失。这不会损害好的哈希,但肯定会使弱哈希变得更好。
unsigned long long LargestPrime48 = 281474976710597u; // FFFFFFFFFFC5
unsigned long long hash48 = hash64 % LargestPrime48;
我已经在库中有一个 64 位哈希函数(C 编码),但我只需要 48 位。我需要 trim 将 64 位哈希值降低为 48 位值,但它必须以安全的方式进行,以最大程度地减少冲突。
散列函数是一个很好的64位散列函数。它已经用 SMHasher("DieHarder" 哈希测试)进行了测试,证明比 Murmur2 更好。据我的同事说,在 lib 中实现的用于 64 位哈希的算法是 xxHash,使用 SMHasher 测试并得到了 Q.Score 10!对于那些想看它的人,xxHash 的源代码可以在 github.com : github.com/Cyan4973/xxHash/releases/latest 上找到。
基本思想是让 64 位哈希值中的所有位(或其中的一部分)对生成的 48 位哈希值产生影响。有什么办法吗?
[后期编辑]:
所以我实现了自己的 48 位(准)-UUID 生成器。
请在此处查看完整的工作解决方案(包括源代码):.
hash >>= 16;
但是如果你觉得任意保留其他 16 位更好,只需使用 XOR。
hash = (hash >> 16) ^ (hash & 0xFFFF);
如果64位的hash不错,那么选择任意48位的hash也是不错的。
unsigned long long Mask48 = 0xFFFFFFFFFFFFu;
unsigned long long hash48 = hash64 & Mask48;
如果 64 位哈希函数较弱,则 mod 由 pow(2,48)
下方的最大素数。一些桶会丢失。这不会损害好的哈希,但肯定会使弱哈希变得更好。
unsigned long long LargestPrime48 = 281474976710597u; // FFFFFFFFFFC5
unsigned long long hash48 = hash64 % LargestPrime48;