如何将64位哈希值缩短到48位值?

סטנ*_*ונן 2 c algorithm math hash uuid

我已经在库中有64位散列函数(C编码),但我只需要48位.我需要将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生成器.
请在此处查看完整的工作解决方案(包括源代码):https://stackoverflow.com/a/47895889/4731718.

chu*_*ica 11

如果64位散列是好的,那么选择任何48位也将是一个很好的散列.@Lee Daniel.当然,信息丢失而且不可逆转.

unsigned long long Mask48 = 0xFFFFFFFFFFFFu;
unsigned long long hash48 = hash64 & Mask48;
Run Code Online (Sandbox Code Playgroud)

如果64位散列函数很弱,那么mod由最大的素数正好在下面pow(2,48).一些桶将丢失.这不会伤害好哈希,但肯定会使弱哈哈变得更好.

unsigned long long LargestPrime48 = 281474976710597u;  // FFFFFFFFFFC5
unsigned long long hash48 = hash64 % LargestPrime48;
Run Code Online (Sandbox Code Playgroud)

  • 最后,掌握数学的人...... :) (3认同)