是否有专门针对 BitSet 的哈希函数?

Is there a hash function specifically for BitSets?

我希望将用户数据存储在 BitSet 或 EWAHCompressedBitmap 中。我需要将 userid 散列为一个整数值,该整数值确定集合中特定用户的位置。我想知道是否存在 returns 0 到 2147483583 之间的正数的散列函数。我正在尝试使用 Murmur3,但在 Java 中它 returns 有符号整数。将返回的整数转换为无符号的 Long,这对于在 BitSet 中用作索引位置来说太大了。

=> (import '(com.googlecode.javaewah EWAHCompressedBitmap))
 com.googlecode.javaewah.EWAHCompressedBitmap
=> (def bm (EWAHCompressedBitmap.))
 #'ninegag.core/bm
=> (.set bm 2147483583)
 true
=> (.set bm -2147483583)
 IndexOutOfBoundsException Position should be between 0 and 2147483583  com.googlecode.javaewah.EWAHCompressedBitmap.set (EWAHCompressedBitmap.java:1230)

我的问题是:在 Java 中生成 0 到 2147483583 之间的哈希值的最佳方法是什么,或者是否有像 BitSet 这样的数据结构支持 Long 作为索引位置?

使用位掩码获取有符号整数的低 31 位 - 保证为无符号数。最大整数 - Integer.MAX_VALUE 是低 31 位设置为 1 的数字,因此它非常适合用作位掩码:

int signedHash = ~0; // 32 ones or -1
int unsignedHash = signedHash & Integer.MAX_VALUE;