java基礎之hashcode理解及hashmap實現原理及MD5

HashCode值

1. hashcode值是int的,64位。int hashCode()。
2. java object類默認的hashcode()計算方法是根據對象的內存地址來計算的。因此可由此來判斷默認不重寫hashcode()方法的兩個對象是否相同。
3. 可重寫obejetc 類的hashCode()方法,去根據object對象的實際內容生成hashcode值,好比String類,改寫了hashcode(),根據string字符串的內容區生成hashcode,而非根據object類默認的內存地址。
4.hashcode值是64爲int值。hashcode值是不可逆的,即沒法根據hashcode值反推原值。但要注意:hashcode是可能重複的,及不一樣的原始值,可能hashcode相同。這也就是爲何hashmap還有個equal()方法來判斷兩個值是否相等。
 
 

HashMap實現原理

 1.爲何會有hashmap出現?
數組數據結構查找方便,刪除困難。
鏈表插入刪除方便,遍歷性能低。
因此需設計一種數據結構,既能查詢快,又能刪除修改快。
 
2.數據結構:數組+鏈表。hashcode決定在數組的存儲位置,是根據key的hashcode值(非value)取模%數組長度,來決定數組的index位置。
hashmap默認數組大小是16.即Entry [16]。
經過equal來解決hash衝突狀況
 
3.loadfactor負載因子,決定hashmap擴容
4.hashmap默認的數組大小是16
5.怎麼解決hash衝突?:equal()方法判斷
6.put(),get()方法內部執行邏輯?
 
 

一致性哈希

 

 

6.爲何String, Interger這樣的wrapper類適合做爲鍵?html

String, Interger這樣的wrapper類是final類型的,具備不可變性,並且已經重寫了equals()和hashCode()方法了。其餘的wrapper類也有這個特色。不可變性是必要的,由於爲了要計算hashCode(),就要防止鍵值改變,若是鍵值在放入時和獲取時返回不一樣的hashcode的話,那麼就不能從HashMap中找到你想要的對象。 java

 

7.ConcurrentHashMap和Hashtable的區別linux

Hashtable和ConcurrentHashMap有什麼分別呢?它們均可以用於多線程的環境,可是當Hashtable的大小增長到必定的時候,性能會急劇降低,由於迭代時須要被鎖定很長的時間。由於ConcurrentHashMap引入了分割(segmentation),不論它變得多麼大,僅僅須要鎖定map的某個部分,而其它的線程不須要等到迭代完成才能訪問map。簡而言之,在迭代的過程當中,ConcurrentHashMap僅僅鎖定map的某個部分,而Hashtable則會鎖定整個map。算法

 

 

8.HashMap的遍歷數據庫

第一種:
  Map map = new HashMap();
  Iterator iter = map.entrySet().iterator();
  while (iter.hasNext()) {
  Map.Entry entry = (Map.Entry) iter.next();
  Object key = entry.getKey();
  Object val = entry.getValue();
  }
  效率高,之後必定要使用此種方式!
第二種:
  Map map = new HashMap();
  Iterator iter = map.keySet().iterator();
  while (iter.hasNext()) {
  Object key = iter.next();編程

Object val = map.get(key);
  }
  效率低,之後儘可能少使用!數組

但是爲何第一種比第二種方法效率更高呢?安全

HashMap這兩種遍歷方法是分別對keyset及entryset來進行遍歷,可是對於keySet實際上是遍歷了2次,一次是轉爲iterator,一次就從hashmap中取出key所對於的value。而entryset只是遍歷了第一次,它把key和value都放到了entry中,即鍵值對,因此就快了。數據結構

1.HashMap與Hashtable的區別:多線程

HashMap能夠接受null鍵值和值,而Hashtable則不能。

Hashtable是線程安全的,經過synchronized實現線程同步。而HashMap是非線程安全的,可是速度比Hashtable快。

 

5.若是HashMap的大小超過了負載因子(load factor)定義的容量,怎麼辦 

HashMap默認的負載因子大小爲0.75,也就是說,當一個map填滿了75%的空間的時候,和其它集合類(如ArrayList等)同樣,將會建立原來HashMap大小的兩倍的數組,來從新調整map的大小,並將原來的對象放入新的數組中。

 

 

下文轉自http://www.cnblogs.com/eternalwt/archive/2013/03/21/2973807.html 感謝做者 

1.在軟件開發的用戶註冊功能中常出現MD5加密這個概念,這個概念有必定的誤導性。嚴格來講:MD5還有sha-一、 RIPEMD以及Haval等不能算是加密算法(雖然經常使用於把密碼變成「密文」),他們只是散列算法,或者叫摘要算法。加密對應解密這個概念,加密算法包括:DES、3DES、IDEA、 RSA、AES等。

2.MD5還有sha-一、 RIPEMD以及Haval等不能算是加密算法,只是散列算法,或者叫摘要算法。

2.MD5還有sha-一、 RIPEMD以及Haval等不能算是加密算法,只是散列算法,或者叫摘要算法。

2.MD5還有sha-一、 RIPEMD以及Haval等不能算是加密算法,只是散列算法,或者叫摘要算法。

 

3.加密對應解密這個概念,加密算法包括:DES、3DES、IDEA、 RSA、AES等。

3.加密對應解密這個概念,加密算法包括:DES、3DES、IDEA、 RSA、AES等。

3.加密對應解密這個概念,加密算法包括:DES、3DES、IDEA、 RSA、AES等。

 

4.MD5算法除了註冊時對用戶密碼進行MD5運算之外,還經常使用於驗證下載的軟件的完整性

5.MD5算法除了註冊時對用戶密碼進行MD5運算之外,還經常使用於驗證下載的軟件的完整性

 

6.MD5運算後的長度是固定的,它顯然不可能包含視頻、軟件等源數據的所有信息。對於加密算法來講,加密後的密文是包含原始數據全部信息的,只是不能被直接讀懂變的安全了。

7.MD5運算後的長度是固定的,它顯然不可能包含視頻、軟件等源數據的所有信息。對於加密算法來講,加密後的密文是包含原始數據全部信息的,只是不能被直接讀懂變的安全了。

 

4.要弄懂這兩類算法的區別,最本質的方式就是把這兩類算法的步驟搞懂,但這須要大量的時間。經過兩類算法的表現能夠對他們的區別有個大致的瞭解:
     1.MD5算法除了註冊時對用戶密碼進行MD5運算之外,還經常使用於驗證下載的軟件的完整性(linux下面md5sum命令能夠支持這一典型應用),經常使用電驢等下載視頻和軟件的用戶應該知道這一點。

MD5運算後的長度是固定的,它顯然不可能包含視頻、軟件等源數據的所有信息。對於加密算法來講,加密後的密文是包含原始數據全部信息的,只是不能被直接讀懂變的安全了。

MD5運算後的長度是固定的,它顯然不可能包含視頻、軟件等源數據的所有信息。對於加密算法來講,加密後的密文是包含原始數據全部信息的,只是不能被直接讀懂變的安全了。

 

 

6. 2.加密算法是一種通訊體系,常常用於分佈式系統。它的目標是數據通過傳輸後只能被特定的有密鑰的人讀懂,包含加密算法和密鑰2個要素。而MD5等散列算法卻不包含運算後的數據只能被特定人讀懂的目標,它只讓機器讀懂。當用於加密時,它加密後的數據對全部人一視同仁,且沒有密鑰機制,沒有好的方法從加密後的數據獲得原始數據,從而保證數據的安全。它並非通訊機制,它是不可逆的。另外它的驗證數據完整性的功能上面已經提到,我想,不少有心人最初正是從這一點意識到這兩類算法的區別把?

 

7. 2.加密算法是一種通訊體系,常常用於分佈式系統。它的目標是數據通過傳輸後只能被特定的有密鑰的人讀懂,包含加密算法和密鑰2個要素。而MD5等散列算法卻不包含運算後的數據只能被特定人讀懂的目標,它只讓機器讀懂。當用於加密時,它加密後的數據對全部人一視同仁,且沒有密鑰機制,沒有好的方法從加密後的數據獲得原始數據,從而保證數據的安全。它並非通訊機制,它是不可逆的。另外它的驗證數據完整性的功能上面已經提到,我想,不少有心人最初正是從這一點意識到這兩類算法的區別把?

 

8.不少編程人員爲了將「密碼」不明示,就對密碼串進行md5散列,在數據庫或文件中保存md5編碼;可是,千萬要注意,真正到了鑑別用戶身份是否合法的時候,不是經過早先記錄下來的md5編碼生成原文再與用戶當場輸入的密碼串進行比較,而是將用戶當場輸入的密碼串也實施md5變換,比較的是先後兩次生成的md5編碼串。

但願這個科學常識對你們有用,不要再試圖從md5編碼揣測原文了


8.不少編程人員爲了將「密碼」不明示,就對密碼串進行md5散列,在數據庫或文件中保存md5編碼;可是,千萬要注意,真正到了鑑別用戶身份是否合法的時候,不是經過早先記錄下來的md5編碼生成原文再與用戶當場輸入的密碼串進行比較,而是將用戶當場輸入的密碼串也實施md5變換,比較的是先後兩次生成的md5編碼串。

但願這個科學常識對你們有用,不要再試圖從md5編碼揣測原文了
相關文章
相關標籤/搜索