又有时间来写博客了呢。。。
哈希原理详解
hash简介
- hash表也叫做散列表,hash有着广泛的应用,主要用于信息安全的加密算法领域,把一些不同长度的信息编码成128位的二进制串,这些编码值叫做hash值。我们可以认为hash就是一种数据和存储位置的映射规则,这种规则被称作散列方法。
- Hash查找:回想我们以前的查找方式都是无目的的在数据集中逐一比较才能找到相应的值 ,但是当我们使用hash查找的时候就不再是这样了,因为映射规则是我们自己制定的,我们就可以根据这个映射规则计算出这个数据存储的区域,这样就可以大大减少查询的次数,查询的速度就会非常的快。
闭散列方法:散列函数H(K)=K mod M
- 线性探查:(H(K)+i)mod M
- 二次探查:(H(K)+i^2)mod M
- 这是两种常用的闭散列的探查方法,我们先将数据通过散列函数插入到散列表(数组)中,查找的时候就只需要在H(K)对应的散列表(数组)的那个区域去查找。
- 这种方法只用到了数组。
开散列方法:
- 这种方法最简单的形式是把散列表中的每一个槽定义为一个链表的表头,散列到一个槽的所有记录都放在这个槽的链表内。
- 如果一个散列表的长度为M,存储N条记录,散列函数(理想情况)将把记录平均的放在M个链表里面,使得每个链表有N/M个记录,查找的效率就会增加很多;但是,如果记录都聚集在少量的链表里面那么查找的效率会很低。
这种方法用到了数组和链表。
接下来到了代码:
package 哈希表;
import java.util.Enumeration;
import java.util.Hashtable;
public class HashDemo {
public static void main(String[] args) {
//使用默认的构造方法Hashtable();
Hashtable<String, Double> htb=new Hashtable<String, Double>();
//put()方法
htb.put("sara", new Double(3.111));
htb.put("Smith", new Double(3.222));
htb.put("jobs", new Double(3.333));
htb.put("tom", new Double(3.444));
htb.put("july", new Double(3.555));
System.out.println(htb.get("sara"));
System.out.println(htb.contains(3.111));
System.out.println(htb.containsKey("Smith"));
System.out.println(htb.containsValue(3.222));
System.out.println(htb.size());
Enumeration<String> name;
String str;
name =htb.keys();
while(name.hasMoreElements()) {
str = (String) name.nextElement();
System.out.println(str + ": " +
htb.get(str));
}
htb.replace("sara", 0.111d);
System.out.println(htb.get("sara"));
htb.remove("sara", 0.111d);
System.out.println(htb.containsKey("sara"));
}
}
以上就是一个简单的测试程序,java里面的Hashtable继承了Map的结构,它存储的内容是键值对的映射。
目前对java里面hashtable键值对的映射组织方法还不太清楚,等改日有空再来分析一下java里hashtable是如何实现键值对映射的。