前言:
Guava 是非常棒的 Java 核心类库,其中各种工具类比如集合框架、图形库、工具类、字符串工具类、缓存技术等实现要优于Java本身的一部分代码。
于是我在业余时间开始结合网上资料加上我自己使用时的一些理解,翻译用户指南并完成一部分优秀代码的中文解析。
不求对别人多大帮助,只求查缺补漏
【Java 没基础——Guava用户指南】Hashing (哈希)
Overview (概述)
Java 的 HashCode 的长度被限制在 32 位,并且哈希算法与他们作用的数据(类或方法)之间没有分离,
因此很难使用另外的哈希算法进行替换。同时,Java 内建的哈希算法生成的 Hash 值是十分劣质的,有一部分原因是因为他们依赖于劣质的 Hashcode 实现,其中包括很多 JDK 中的实现类。
Java 中 Object.hashCode
运行十分快速,但是缺乏对 哈希碰撞 问题的预防,同时也缺乏对散列值的期望。这种特性却让他十分适合与应用在哈希表中,因为额外的哈希碰撞只会
带来很小的性能损失,同时十分差劲的分散性可以采用二次哈希的方法解决(Java 中几乎所有
合理的哈希算法(哈希函数)都采用这种方法进行实现)。然而,在简单哈希表之外的很多哈希应用中,
Object.hashCode
却是不足的,因此com.google.common.hash
包被设计出来。
Organization (组成)
通过查看包的 Java doc 文档, 我们会发现很多不同的类,但是并没有明显的说明他们是如何协同工作的。
让我们先看一下这个类库的一部分代码:
HashFunction hf = Hashing.md5();
HashCode hc = hf.newHasher()
.putLong(id)
.putString(name, Charsets.UTF_8)
.putObject(person, personFunnel)
.hash();
HashFunction (哈希方法–生成Hash值的方法)
[HashFunction
] 是一个对引用透明的、无状态(无返回值)的方法,他把任意的数据块映射到固定长度的地址中,
尽量确保相同的输入一定产生相同的输出ÿ