我们HashMap会有一个rehash的过程,为什么呢?因为java内建的散列码被限制为32位,而且没有分离散列算法和所作用的数据,所以替代算法比较难做。我们使用HashMap的时候它自身有一个rehash的过程,所以我们无需操心。但是如果我们自己离开hashmap的内容,去使用Object.hashCode()就不有可能会比较坑爹了,碰撞处理我们自己去做并不容易。但是,我们可以使用Guava的hash功能。

Guava的Hash package底下的内容比较多:

它提供了不同的Hash算的实现,然后我们需要先从继承体系上面去看一下。

Hash算法的继承体系:

Function函数的继承体系:

然后还有Funnel接口等,基本上已经包括Hash的组成内容,下面我们挨个来看下都是做什么的。

/**
* An object which can receive a stream of primitive values.
@Beta
public interface PrimitiveSink {···}------------------一个能接收原始数据类型流的对象?

里面定义了一堆方法,都是putxxxxvalue:

  PrimitiveSink putBytes(byte[] bytes, int off, int len);

  PrimitiveSink putShort(short s);

  PrimitiveSink putInt(int i);

  PrimitiveSink putLong(long l);

  PrimitiveSink putFloat(float f);

  PrimitiveSink putDouble(double d);

  PrimitiveSink putBoolean(boolean b);

  PrimitiveSink putChar(char c);

  PrimitiveSink putUnencodedChars(CharSequence charSequence);

  PrimitiveSink putString(CharSequence charSequence, Charset charset);

非常好理解,不赘述。然后我们看Hasher这个核心类(接口)是干啥的:

@Beta
public interface Hasher extends PrimitiveSink {
@Override
Hasher putByte(byte b); @Override
Hasher putBytes(byte[] bytes);
}

好吧,其实它就是把PrimitiveSink的方法给全部override了一遍,然后它新增了几个方法:

  <T> Hasher putObject(T instance, Funnel<? super T> funnel);------------一个简化的put object进行hash的方法

  @CheckReturnValue
HashCode hash();---实际做hash的方法 @Override
@Deprecated
int hashCode();----不推荐使用,但是必须覆盖的hashcode

上个代码示例:

package com.congsg.learning;

import com.google.common.base.Charsets;
import com.google.common.hash.*; import java.nio.charset.Charset; /**
* Created by congshaogang on 16/3/29.
*/
public class GuavaHashTest { public static void main(String[] args) { HashFunction function_0 = Hashing.md5();
HashFunction function_1 = Hashing.murmur3_128();
Hasher hasher_0 = function_0.newHasher();
Hasher hasher_1 = function_1.newHasher(); Person person = new Person();
person.setAge(27);
person.setName("hahahah");
person.setAddress("北京三里屯");
person.setPhoneNumber(16666666666L);
person.setMale(Male.man); HashCode code_0 = hasher_0.putInt(person.getAge())
.putString(person.getName(), Charsets.UTF_8)
.putString(person.getAddress(), Charsets.UTF_8)
.putLong(person.getPhoneNumber())
.putObject(person.getMale(), new Funnel<Male>() {
@Override
public void funnel(Male from, PrimitiveSink into) {
into.putString(from.name(),Charsets.UTF_8);
}
}).hash();
HashCode code_1 = hasher_1.putInt(person.getAge())
.putString(person.getName(), Charsets.UTF_8)
.putString(person.getAddress(), Charsets.UTF_8)
.putLong(person.getPhoneNumber())
.putObject(person.getMale(), new Funnel<Male>() {
@Override
public void funnel(Male from, PrimitiveSink into) {
into.putString(from.name(),Charsets.UTF_8);
}
}).hash();
System.out.println(code_0.asLong());
System.out.println(code_1.asLong());
} public enum Male {
man, woman;
} public static class Person {
int age;
String name;
String address;
long phoneNumber;
Male male; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public long getPhoneNumber() {
return phoneNumber;
} public void setPhoneNumber(long phoneNumber) {
this.phoneNumber = phoneNumber;
} public Male getMale() {
return male;
} public void setMale(Male male) {
this.male = male;
}
}
}

我们可以利用自己去构造一些primitive的数据类型去进行hash操作,最后获得hash值。

Guava包学习--Hash的更多相关文章

  1. Guava包学习---Lists

    Guava包是我最近项目中同事推荐使用的,是google推出的库.里面的功能非常多,包括了集合.缓存.原生类型支持.并发库.通用注解.字符串处理.IO等.我们项目中使用到了guava依赖,但是实际上只 ...

  2. Guava包学习--EventBus

    之前没用过这个EventBus,然后看了一下EventBus的源码也没看明白,(-__-)b.反正大概就是弄一个优雅的方式实现了观察者模式吧.慢慢深入学习一下. 观察者模式其实就是生产者消费者的一个变 ...

  3. Guava包学习---I/O

    Guava的I/O平时使用不太多,目前项目原因导致基本上只有在自己写一些文本处理小工具才用得到.但是I/O始终是程序猿最常遇到的需求和面试必问的知识点之一.同时Guava的I/O主要面向是时JDK5和 ...

  4. Guava包学习-Cache

    这段时间用到了ehcache和memcache,memcache只用来配置在tomcat中做负载均衡过程中的session共享,然后ehcache用来存放需要的程序中缓存. Guava中的Cache和 ...

  5. Guava包学习---Maps

    Maps包方法列表: 还是泛型创建Map: public static <K, V> HashMap<K, V> newHashMap() { return new HashM ...

  6. Guava包学习--Table

    Table,顾名思义,就好像HTML中的Table元素一样,其实就是行+列去确定的值,更准确的比喻其实就是一个二维矩阵. 其实它就是通过行+列两个key去找到一个value,然后它又containsv ...

  7. Guava包学习---Bimap

    Bimap也是Guava中提供的新集合类,别名叫做双向map,就是key->value,value->key,也就是你可以通过key定位value,也可以用value定位key. 这个场景 ...

  8. Guava包学习-Multimap

    它和上一章的MultiSet的继承结果很相似,只不过在上层的接口是Multimap不是Multiset. Multimap的特点其实就是可以包含有几个重复Key的value,你可以put进入多个不同v ...

  9. Guava包学习---Sets

    Sets包的内容和上一篇中的Lists没有什么大的区别,里面有些细节可以看一下: 开始的创建newHashSet()的各个重载方法.newConcurrentHashSet()的重载方法.newTre ...

随机推荐

  1. [javaEE] http协议详细

    上一篇:http://www.cnblogs.com/taoshihan/p/5346731.html HTTP请求 请求行 GET /taoshihan/p/5346731.html HTTP/1. ...

  2. 手把手教你写一个java的orm(完)

    生成sql:select 上一篇讲了怎样生成一个sql中where的一部分,之后我们要做事情就简单很多了,就只要像最开始一样的生成各种sql语句就好了,之后只要再加上我们需要的条件,一个完整的sql就 ...

  3. (POI)Excel格式转Html格式

    Demo结构和引用的Jar包 源代码(TestDemo.java) POI中将Excel转换为HTML方法仅能转换HSSFWorkBook类型(即03版xls),故可以先将读取的xlsx文件转换成xl ...

  4. data whitening

    http://ufldl.stanford.edu/tutorial/unsupervised/PCAWhitening/

  5. Django基础四之模板系统

    一 语法   模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法): {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二 变量 在Django的模板语言中按此语法使 ...

  6. IIS 部署 Python Django网站流程(受够了野路子)

    知道的,百度上搜出来的东西质量令人唏嘘.当你求助的时候多半还得靠自己,或者靠Google 介入正题,详细来一遍流程吧 当然,我是用Visual Studio 2019 来编辑开发Django项目的,如 ...

  7. opencv3.2.0图像处理之中值滤波medianBlur API函数

    /*中值滤波:medianBlur函数是非线性滤波 函数原型:void medianBlur(inputArray src,OutputArray dst,int ksize) 参数详解: input ...

  8. chrome 浏览器调用 ocx 插件(二)

    原文:http://blog.csdn.net/wangchao1988ok/article/details/46561537 chrome 版本:43.0.2357.124 之前写过关于 chrom ...

  9. 外业数据采集平台(GPS+Android Studio+Arcgis for android 100.2.1)

    外业数据采集平台 1. 综述 在室外,通过平板或者手机接收GPS坐标,实时绘制点.线.面数据,以便为后续进行海域监测.土地确权.地图绘图提供有效数据和依据. 2. 技术路线 Android studi ...

  10. Linux Windows平台添加pip源

    直接应用 pip3 install django -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com​ ...