哈希函数的设计:java
1.键经过哈希函数获得索引分布均匀:特殊领域的哈希函数设计方式甚至有专门的论文这个不考虑,咱们只是设计最普通的函数设计:算法
哈希函数总结:上述设计方式都是转化成整型处理,并非惟一的方法,ide
原则:函数
1.一致性:若是a == b,则hash(a) == hash(b)this
2.高效性:计算高效简便设计
3.均匀性:哈希值均匀分布code
2:JAVA中的hashCode方法:blog
package hash; /** * Created by admin on 2019/1/10. */ public class HashCode { public static void main(String[] args) { Integer a = 42; System.out.println(a.hashCode()); Integer b = -42; System.out.println(b.hashCode()); Double c = 3.141592653; System.out.println(c.hashCode()); String d = "airycode"; System.out.println(d.hashCode()); Student s = new Student(3,2,"bobo","bobo"); System.out.println(s.hashCode()); Student s2 = new Student(3,2,"BoBo","BoBo"); System.out.println(s2.hashCode()); } } package hash; /** * Created by admin on 2019/1/10. */ public class Student { int grade; int cls; String firstName; String lastName; public Student(int grade, int cls, String firstName, String lastName) { this.grade = grade; this.cls = cls; this.firstName = firstName; this.lastName = lastName; } @Override public int hashCode() { int B = 31; int hash = 0; hash = hash*B+grade; hash = hash*B+cls; hash = hash*B+firstName.toLowerCase().hashCode();//BB 和bb是一我的 hash = hash*B+lastName.toLowerCase().hashCode(); return hash; } }
3:哈希函数冲突的处理:链地址法索引
java8以前,哈希表的实现,每一个位置上对应的是一个链表。java8以后,数据量小的时候,仍是链表,当哈希冲突达到必定的程度每一个位置从链表转成红黑树。字符串