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類適合作為鍵?

String, Interger這樣的wrapper類是final類型的,具有不可變性,而且已經重寫了equals()和hashCode()方法了。其他的wrapper類也有這個特點。不可變性是必要的,因為為了要計算hashCode(),就要防止鍵值改變,如果鍵值在放入時和獲取時返回不同的hashcode的話,那么就不能從HashMap中找到你想要的對象。 

 

7.ConcurrentHashMap和Hashtable的區別

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-1、 RIPEMD以及Haval等不能算是加密算法(雖然常用於把密碼變成“密文”),他們只是散列算法,或者叫摘要算法。加密對應解密這個概念,加密算法包括:DES、3DES、IDEA、 RSA、AES等。

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

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

2.MD5還有sha-1、 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編碼揣測原文了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM