如何将 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;