如何用hash3 32位生成任意长度的散列

如何用hash3 32位生成任意长度的散列,hash,hash-function,murmurhash,Hash,Hash Function,Murmurhash,我目前正在尝试使用杂音散列3对一组字符串进行散列,因为32位的散列对我来说似乎太大,无法处理。我想将用于生成散列的位数减少到24位左右。我已经找到了一些问题来解释如何使用xor折叠将其减少到16、8、4、2位,但这些位对于我的应用程序来说太少了 有人能帮我吗?当你有一个32位的散列时,它是这样的(带有空格以便于阅读): 要获得24位哈希,需要保留较低的24位。其表示法因语言而异,但许多语言使用“x&0xFFF”进行位AND操作,并使用0xFFF十六进制。实际上是这样的(AND逻辑应用于数字的每个

我目前正在尝试使用杂音散列3对一组字符串进行散列,因为32位的散列对我来说似乎太大,无法处理。我想将用于生成散列的位数减少到24位左右。我已经找到了一些问题来解释如何使用xor折叠将其减少到16、8、4、2位,但这些位对于我的应用程序来说太少了


有人能帮我吗?

当你有一个32位的散列时,它是这样的(带有空格以便于阅读):

要获得24位哈希,需要保留较低的24位。其表示法因语言而异,但许多语言使用“x&0xFFF”进行位AND操作,并使用0xFFF十六进制。实际上是这样的(AND逻辑应用于数字的每个垂直列,因此1和1是1,0和1是0):

…可以理解为:按位AND仅重新训练x的最高有效字节,然后将其右移8位,然后按位排他或原始值x。上述表达式的结果将设置位23(从0开始计算为最小有效位),当且仅当一个或另一个(但不是两个)第23位和第31位的值设置为x。类似地,位22是位22和30的异或。所以它下降到第16位,这是第16位和第24位的异或。位0..15保持与原始值x中的相同

另一种方法是选择一个比2^24-1稍低的素数,然后将你的32位杂音哈希值mod(%),这将比上面的XOR更有效地混合高阶位,但你显然只能得到素数-1的值,而不是一直到2^24-1的值

1101 0101  0101 0010  1010 0101  1110 1000
1101 0101  0101 0010  1010 0101  1110 1000 AND  <-- hash value from above
0000 0000  1111 1111  1111 1111  1111 1111      <-- 0xFFF in binary
==========================================
0000 0000  0101 0010  1010 0101  1110 1000
 ((x & 0xF000) >> 8) ^ x