【问题标题】:Is there a hash function specifically for BitSets?是否有专门针对 BitSets 的哈希函数?
【发布时间】:2015-10-20 10:22:40
【问题描述】:

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

【问题讨论】:

    标签: java hash clojure long-integer


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多