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

时间:2015-10-20 02:07:24

标签: java hash clojure long-integer

我希望将用户数据存储在BitSet或EWAHCompressedBitmap中。我需要向userid哈希到一个整数值,该值确定集合中特定用户的位置。我想知道是否有一个哈希函数返回0到2147483583之间的正数。我正在尝试使用Murmur3但在Java中它返回有符号整数。将返回的整数强制转换为unsigned,从而得到一个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作为索引位置?

1 个答案:

答案 0 :(得分:3)

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

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