`
leadtoit
  • 浏览: 61677 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

guava笔记11-Hashing

 
阅读更多

一.Guava提供了一些方法帮助我们生成hash值。

主要有下面几个帮助类:

HashFunction: hash函数,可以用于创建Hasher对象

Hashing:定义了一些hash函数,主要有md5(),murmur3_128(),murmur3_32(),sha1(),sha256(),sha512(),goodFastHash(int bits)。

Hasher:计算hash值,提供了putXxx()方法用于添加数据,以及hash()方法返回计算结果HashCode。

HashCode:hash值计算结果

Funnel:定义了怎样将一个Object对象分解为primitive 类型,Hasher的putObject方法需要传入这样的对象。

 

示例:

class Person {

  final int id;

  final String firstName;

  final String lastName;

  final int birthYear;

}

 

//Funnel定义了Person对象如何分解为primitive 类型,以便Hasher的putObject方式使用

Funnel<Person> personFunnel = new Funnel<Person>() {

  @Override

  public void funnel(Person person, PrimitiveSink into) {

    into

      .putInt(person.id)

      .putString(person.firstName, Charsets.UTF_8)

      .putString(person.lastName, Charsets.UTF_8)

      .putInt(birthYear);

  }

};

 

HashFunction hf = Hashing.md5();

HashCode hc = hf.newHasher()

       .putLong(id)

       .putString(name, Charsets.UTF_8)

       .putObject(person, personFunnel) //putObject方法

       .hash();

System.out.println(hc. asInt ());  //hash结果输出

System.out.println(hc. asBytes());  //hash结果输出

 

二.  BloomFilter

BloomFilter是一种算法,用于判断一个对象是否包含在一个集合里面。这种做法只需要占用很低的空间,效率也非常高。但是判断结果会有一定的误差。

大概实现方式为:

1.       先定义一个n位的二进制数组。

2.       对任意一个对象,采用m种hash函数计算它的hash值,得到的每个hash值映射到数组的某一位,把二进制数组的这一位就标记为1。

3.       判断一个对象是否包含在集合中时,采用同样的m种hash函数计算hash值,同样映射到数组中的位,如果这些位全部为1,则表示该对象确实很可能包含于集合中,只要有一位不为1,则该对象一定不包含于集合中。

 

自从Burton Bloom在70年代提出Bloom Filter之后,Bloom Filter就被广泛用于拼写检查和数据库系统中。近一二十年,伴随着网络的普及和发展,Bloom Filter在网络领域获得了新生,各种Bloom Filter变种和新的应用不断出现。

 

这种做法适用于能够容忍一定的错误率的场景。Guava中的BloomFilter实现了这种算法。

BloomFilter<Person> friends = BloomFilter.create(personFunnel, 500, 0.01);

for(Person friend : friendsList) {

  friends.put(friend);

}

// much later

if (friends.mightContain(dude)) {

  // the probability that dude reached this place if he isn't a friend is 1%

  // we might, for example, start asynchronously loading things for dude while we do a more expensive exact check

}

 

BloomFilter.create方法创建了BloomFilter对象,三个参数分别指定了Object分解为primitive 的方式(因为Hasher.putObject方法需要这个参数),集合的预期大小,以及容错率。

BloomFilter的hash函数策略目前只有一种BloomFilterStrategies. MURMUR128_MITZ_32,它可以根据你期望的集合大小和容错率来计划hash函数的个数及二进制数组的大小。

BloomFilter.put方法可以将对象放到集合中

BloomFilter. mightContain用于判断对象是否可能包含于集合中

BloomFilter. expectedFpp用于得到目前的错误率(这个不一定跟create方法传入的容错率参数相等,因为目前加入集合中的元素个数不一定等于crate方法传入的预期元素个数)

 

分享到:
评论

相关推荐

    guava-30.0-jre-API文档-中文版.zip

    赠送jar包:guava-30.0-jre.jar; 赠送原API文档:guava-30.0-jre-javadoc.jar; 赠送源代码:guava-30.0-jre-sources.jar; 赠送Maven依赖信息文件:guava-30.0-jre.pom; 包含翻译后的API文档:guava-30.0-jre-...

    guava-25.0-jre-API文档-中文版.zip

    赠送jar包:guava-25.0-jre.jar; 赠送原API文档:guava-25.0-jre-javadoc.jar; 赠送源代码:guava-25.0-jre-sources.jar; 赠送Maven依赖信息文件:guava-25.0-jre.pom; 包含翻译后的API文档:guava-25.0-jre-...

    guava-27.0.1-jre-API文档-中文版.zip

    赠送jar包:guava-27.0.1-jre.jar; 赠送原API文档:guava-27.0.1-jre-javadoc.jar; 赠送源代码:guava-27.0.1-jre-sources.jar; 赠送Maven依赖信息文件:guava-27.0.1-jre.pom; 包含翻译后的API文档:guava-...

    guava-28.2-jre-API文档-中文版.zip

    赠送jar包:guava-28.2-jre.jar; 赠送原API文档:guava-28.2-jre-javadoc.jar; 赠送源代码:guava-28.2-jre-sources.jar; 赠送Maven依赖信息文件:guava-28.2-jre.pom; 包含翻译后的API文档:guava-28.2-jre-...

    guava-29.0-jre-API文档-中英对照版.zip

    赠送jar包:guava-29.0-jre.jar; 赠送原API文档:guava-29.0-jre-javadoc.jar; 赠送源代码:guava-29.0-jre-sources.jar; 赠送Maven依赖信息文件:guava-29.0-jre.pom; 包含翻译后的API文档:guava-29.0-jre-...

    guava-20.0-API文档-中文版.zip

    赠送jar包:guava-20.0.jar; 赠送原API文档:guava-20.0-javadoc.jar; 赠送源代码:guava-20.0-sources.jar; 赠送Maven依赖信息文件:guava-20.0.pom; 包含翻译后的API文档:guava-20.0-javadoc-API文档-中文...

    guava-28.2-jre-API文档-中英对照版.zip

    赠送jar包:guava-28.2-jre.jar; 赠送原API文档:guava-28.2-jre-javadoc.jar; 赠送源代码:guava-28.2-jre-sources.jar; 赠送Maven依赖信息文件:guava-28.2-jre.pom; 包含翻译后的API文档:guava-28.2-jre-...

    guava-26.0-android-API文档-中英对照版.zip

    赠送jar包:guava-26.0-android.jar; 赠送原API文档:guava-26.0-android-javadoc.jar; 赠送源代码:guava-26.0-android-sources.jar; 赠送Maven依赖信息文件:guava-26.0-android.pom; 包含翻译后的API文档:...

    guava-26.0-android-API文档-中文版.zip

    赠送jar包:guava-26.0-android.jar; 赠送原API文档:guava-26.0-android-javadoc.jar; 赠送源代码:guava-26.0-android-sources.jar; 赠送Maven依赖信息文件:guava-26.0-android.pom; 包含翻译后的API文档:...

    guava-24.1-jre-API文档-中英对照版.zip

    赠送jar包:guava-24.1-jre.jar; 赠送原API文档:guava-24.1-jre-javadoc.jar; 赠送源代码:guava-24.1-jre-sources.jar; 赠送Maven依赖信息文件:guava-24.1-jre.pom; 包含翻译后的API文档:guava-24.1-jre-...

    guava-23.0-API文档-中文版.zip

    赠送jar包:guava-23.0.jar; 赠送原API文档:guava-23.0-javadoc.jar; 赠送源代码:guava-23.0-sources.jar; 赠送Maven依赖信息文件:guava-23.0.pom; 包含翻译后的API文档:guava-23.0-javadoc-API文档-中文...

    guava-23.6-android

    guava-23.6-android guava 版本23.6的 jar 包

    guava-27.0-jre.jar

    guava-27.0-jre.jar

    guava-18.0-API文档-中文版.zip

    赠送jar包:guava-18.0.jar; 赠送原API文档:guava-18.0-javadoc.jar; 赠送源代码:guava-18.0-sources.jar; 包含翻译后的API文档:guava-18.0-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:...

    guava-27.1-jre.jar

    guava-27.1-jre

    guava-28.0-android-API文档-中文版.zip

    赠送jar包:guava-28.0-android.jar; 赠送原API文档:guava-28.0-android-javadoc.jar; 赠送源代码:guava-28.0-android-sources.jar; 赠送Maven依赖信息文件:guava-28.0-android.pom; 包含翻译后的API文档:...

    guava-20.0-API文档-中英对照版.zip

    赠送jar包:guava-20.0.jar; 赠送原API文档:guava-20.0-javadoc.jar; 赠送源代码:guava-20.0-sources.jar; 赠送Maven依赖信息文件:guava-20.0.pom; 包含翻译后的API文档:guava-20.0-javadoc-API文档-中文...

    最新版 guava-30.1-jre.jar

    最新版 guava-30.1-jre.jar

    guava-31.1-jre.jar

    guava

    guava-27.0.1-jre-API文档-中英对照版.zip

    赠送jar包:guava-27.0.1-jre.jar; 赠送原API文档:guava-27.0.1-jre-javadoc.jar; 赠送源代码:guava-27.0.1-jre-sources.jar; 赠送Maven依赖信息文件:guava-27.0.1-jre.pom; 包含翻译后的API文档:guava-...

Global site tag (gtag.js) - Google Analytics