哈希函數的設計: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以後,數據量小的時候,仍是鏈表,當哈希衝突達到必定的程度每一個位置從鏈表轉成紅黑樹。字符串