我正在将用户数据存储在BitSet或EWAHCompressedBitmap中。我需要将userid哈希为一个整数值,该整数值确定集合中特定用户的位置。我想知道是否有哈希函数返回0到2147483583之间的正数。我试图使用Murmur3,但在Java中它返回带符号的整数。将返回的整数强制转换为unsigned会导致Long变大,而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;

关于java - 是否有专门用于BitSet的哈希函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33226841/

10-10 01:04