是否有专门针对 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;
我希望将用户数据存储在 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;