Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在clojure中构建bloom过滤器时使用哪些哈希技术?_Java_Clojure_Hash_Bloom Filter - Fatal编程技术网

Java 在clojure中构建bloom过滤器时使用哪些哈希技术?

Java 在clojure中构建bloom过滤器时使用哪些哈希技术?,java,clojure,hash,bloom-filter,Java,Clojure,Hash,Bloom Filter,我想在Clojure中构建一个bloom过滤器,但我对基于JVM的语言可能提供的所有哈希库都不太了解 Clojure中最快(而不是最准确)的bloom映射实现应该使用什么呢?因此bloom过滤器的有趣之处在于,要有效工作,它们需要多个哈希函数 Java字符串已经有了一个内置的哈希函数,您可以使用它——返回32位整数哈希。在大多数情况下,这是一个OK哈希代码,这可能就足够了:例如,如果您将其划分为两个单独的16位哈希代码,那么这可能足以让您的bloom过滤器工作。您可能会遇到一些冲突,但这很好-布

我想在Clojure中构建一个bloom过滤器,但我对基于JVM的语言可能提供的所有哈希库都不太了解


Clojure中最快(而不是最准确)的bloom映射实现应该使用什么呢?

因此bloom过滤器的有趣之处在于,要有效工作,它们需要多个哈希函数

Java字符串已经有了一个内置的哈希函数,您可以使用它——返回32位整数哈希。在大多数情况下,这是一个OK哈希代码,这可能就足够了:例如,如果您将其划分为两个单独的16位哈希代码,那么这可能足以让您的bloom过滤器工作。您可能会遇到一些冲突,但这很好-布鲁姆过滤器预计会有一些冲突

如果没有,您可能会希望自己滚动,在这种情况下,我建议使用来访问原始字符数据,然后使用它来计算多个哈希代码

开始使用Clojure代码(仅对字符值求和):

注意使用Clojure的Java互操作调用getChars,使用areduce在字符数组上进行非常快速的迭代


您可能还对我在Github上找到的Java bloom筛选器实现感兴趣:。hashcode实现乍一看似乎还可以,但它使用了字节数组,我认为这比使用字符的效率要低一些,因为需要处理字符编码开销。

请查看中的Bloom Filter实现。这使用了非常快速的算法,并以不同的方式组合两个散列(或同一散列的两个部分,因为升级到MurrueHash3而不是MurrueHash2)来计算所需的散列数

组合生成方法如中所述

下面是来自Cassandra源代码的一个片段:

    long[] hash = MurmurHash.hash3_x64_128(b, b.position(), b.remaining(), 0L);
    long hash1 = hash[0];
    long hash2 = hash[1];
    for (int i = 0; i < hashCount; ++i)
    {
        result[i] = Math.abs((hash1 + (long)i * hash2) % max);
    }
long[]hash=murrushash.hash3_x64_128(b,b.位置(),b.剩余(),0L);
长哈希1=哈希[0];
长哈希2=哈希[1];
for(int i=0;i

另请参见

您的密钥是什么类型的数据?串?字节数组?整数?UUIDs?我正在测试一组字符串的成员身份。您可以尝试对字符串上的
hash()
方法报告的内置哈希值重复应用混合哈希函数,例如,生成的值可能相关性太强,这可能使bloom筛选器无效。我过去使用的一种方法是使用一个具有很长结果的哈希函数,如SHA-256,并将结果分割成块。这对于您的目的来说可能太慢了。最简单的方法可能是在谷歌上搜索“字符串哈希函数”,并实现它给出的一些结果。在用Java编写了Bloom过滤器(问题是关于JVM和哈希算法)之后,不需要多个哈希函数。事实上(见下面的答案),一个好的MumurHash对于Bloom过滤器来说是非常好的,因为它们非常快,并且碰撞发生率的轻微增加并不是一个真正的因素,因为Bloom过滤器本身就具有误报率。集合中的数据类型也不相关,因为性能和管理误报率的最佳实践是通过对输入键进行散列来平滑位集合分布。@Darrell-您需要足够的独立计算位,以便将结果分割为多个散列函数。这就是下面的答案——我将其定义为“使用多个散列函数”:——(问题是关于“对基于JVM的语言可能可用的库进行散列”,因此评论是指那些与使用/计算的“散列桶数”相对应的库。我认为短语“hash function”意味着一个函数或方法(实现),而下面的注释表示“计算所需的hash数”。很抱歉出现任何困惑,但希望这能为新用户澄清,因为这是一个相当沉重的计算机科学主题。
    long[] hash = MurmurHash.hash3_x64_128(b, b.position(), b.remaining(), 0L);
    long hash1 = hash[0];
    long hash2 = hash[1];
    for (int i = 0; i < hashCount; ++i)
    {
        result[i] = Math.abs((hash1 + (long)i * hash2) % max);
    }