您现在的位置是:首页 > 正文

guava笔记11-Hashing

2024-04-01 00:18:58阅读 1

一.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方法传入的预期元素个数)

 

网站文章

  • Java 常用类库

    Java 类库就是 Java API (应用程序接口),是系统提供的已实现的标准类的集合,使用 Java 类库可以完成涉及字符串处理、图形、网络等多方面的操作。 API(Applicat...

    2024-04-01 00:18:32
  • C++基础(下)——内联函数、auto关键字、范围的for、指针空值 nullptr

    C++基础(下)——内联函数、auto关键字、范围的for、指针空值 nullptr

    C++基础(下)——内联函数、auto关键字、范围的for、指针空值 nullptr

    2024-04-01 00:18:18
  • C# JSON格式及读写JSON数据

    C# JSON格式及读写JSON数据

    详解JSON格式及读取、生成方法

    2024-04-01 00:18:12
  • 下载bert的预训练模型并加载训练教程

    下载bert的预训练模型并加载训练教程

    下载bert的预训练模型

    2024-04-01 00:17:50
  • G1分配大内存测试

    package org.ziegler.gc; /** * VM参数:-XX:+UseG1GC -Xms20M -Xmx20M -Xmn10M -Xlog:gc* -XX:SurvivorRatio=...

    2024-04-01 00:17:41
  • SSM框架的使用(下)

    SSM框架的使用(下)

    SSM框架的使用(下)回顾与上次的配置中我们成功的将spring 与 mybatis进行了整合,并成功的读取到我们存储在数据中的信息。想要查看之前的操作请点击SSM框架使用下我们继续完成之前没有准备好的操作1. 配置文件上次我们剩下一个springmvc-servlet.xml这个配置文件,其实除了这个配置文件之外,还有一个配置文件——web.xml。web.xml这个配置文件位于We...

    2024-04-01 00:17:32
  • 协方差矩阵 多元高斯分布

    协方差矩阵 多元高斯分布

    协方差矩阵对于一维随机变量直接用方差即可衡量随机变量x与其期望E(x)的偏离程度,对于多维随机变量X,需要用一个矩阵来表示偏离程度,矩阵的对角线是每个维度自己的方差,对角线以外表示不同的维度之间的协方...

    2024-04-01 00:17:09
  • JAVA线程池

    JAVA线程池

    目录池的思想JDK中线程池的使用线程池的核心父接口ExecutorService ThreadPoolExecutor子类的核心构造方法参数

    2024-04-01 00:17:03
  • 影响未来十年的10项互联网新技术

    影响未来十年的10项互联网新技术

    影响未来十年的10项互联网新技术 最近InfoWorld网站公布了可能影响未来十年的十项新技术。虽然每个人的观点会有不同,但是我们相信,这十项新技术足以代表大部分的观点,同时也可以确信在未来几年这十项技术能给我们生活带来翻天覆地的变化。1.私有云技术IT经理可以借由公共云提供商首创的技术和架构,并把它们应用到自己的数据中心。私有云,往往有许多移动部件,包括虚拟化管理...

    2024-04-01 00:16:55
  • Ubuntu 安装lnmp+nginx 访问 .php文件变成下载

    Ubuntu 安装lnmp+nginx 访问 .php文件变成下载

    安装NGINXsudo apt-get update#更新源sudo apt-get install nginx #安装nginxsudo service nginx start #启动nginx安装PHPsudo apt-add-repository ppa:ondrej/phpsudo apt-get updatesudo apt-get install php7.2 php7...

    2024-04-01 00:16:31