C语言 如何将64位哈希值缩短为48位值



我已经在库中有64位哈希函数(C编码),但我只需要48位。我需要将64位哈希值减少到48位值,但它必须以安全的方式减少碰撞。

哈希函数是一个非常好的64位哈希函数。它已经用SMHasher("DieHarder"哈希测试)进行了测试,并证明比Murmur2更好。根据我的同事,在库中实现的64位哈希算法是xxHash,用SMHasher测试并获得了10分的Q.Score !对于那些想要查看它的人,可以在github.com上获得xxHash的源代码:github.com/Cyan4973/xxHash/releases/latest。

基本思想是让64位哈希值中的所有位(或其中的一部分)对产生的48位哈希值产生影响。有什么办法吗?

[编辑]末:
所以我实现了我自己的48位(准)uuid生成器。请在这里查看完整的工作解决方案(包括源代码):https://stackoverflow.com/a/47895889/4731718.

如果64位哈希是好的,那么选择任何48位也将是一个好的哈希。@Lee丹尼尔。当然,信息会丢失且不可逆转。

unsigned long long Mask48 = 0xFFFFFFFFFFFFu;
unsigned long long hash48 = hash64 & Mask48;

如果64位哈希函数是弱的,则取pow(2,48)下最大的素数。有些桶会丢失。这不会损害一个好的散列,但肯定会使弱散列更好。

unsigned long long LargestPrime48 = 281474976710597u;  // FFFFFFFFFFC5
unsigned long long hash48 = hash64 % LargestPrime48;
hash >>= 16;

但如果你觉得任意保留其他16位更好,就使用异或。

hash = (hash >> 16) ^ (hash & 0xFFFF);

最新更新