簡單來說就是先得到壹個字符串的MD5值,然後根據這個值計算出壹個不同的字符串,但是它們的MD5值是壹樣的。這就是MD5碰撞,概率很小。
我們常見的碰撞方法:暴力碰撞(窮舉法、字典法),就是利用計算機資源,嘗試與已知的MD5代碼進行碰撞。
1,窮舉方法
窮舉法就是不斷嘗試各種字符的排列組合,看看MD5碼的哪種組合能匹配。缺點是太費時間。舉個例子,假設我們要破解壹個大小寫字母和數字混合的6位密碼,那麽壹個* * *有(26+26+10) 6種組合。這個數字的規模超過500億。
2.字典法
字典法是將計算結果以映射表的形式存儲,壹個原文對應壹個MD5值。通過查找已知的MD5代碼,可以直接查出原文。字典法體現了算法設計中“以空間換時間”的思想。缺點是占用空間比較大,實際上需要窮盡所有的輸入,但是窮盡的結果是保存的。
使用字典法解密md5的網站:/
通常有兩種方法來處理沖突:開放尋址方法和鏈接方法。前者是將所有節點存儲在哈希表T [0...m-1];後者通常將哈希後的所有元素放在壹個鏈表的同壹個槽中,並將這個鏈表的頭指針放在哈希表T[0..m-1】。
1,開放式尋址方法
所有的元素都在哈希表中,每個條目要麽包含動態集的壹個元素,要麽為零。在這種方法中,哈希表可能太滿,以至於無法插入新元素。在開放式尋址方法中,當要插入元素時,可以連續檢查或檢測哈希表中的項目,直到有空槽來放置要插入的關鍵字。開放尋址有三種技術:線性檢測、二次檢測和雙重檢測。
線性檢測方法適用於場景。
Java中的ThreadLocalMap采用開放尋址方式解決哈希沖突,因為開放尋址方式的時間復雜度在極端環境下會退化為O(n),所以適用於數據較少的場景。
2.鏈地址法
鏈地址法也叫鏈表法。這種方法比較常見,也比較簡單。插入元素時,如果發現當前位置有元素,則以當前節點為頭節點(尾插入法)或尾節點(頭插入法)構造壹個鏈表。如果進壹步優化,鏈表可以修改成紅黑樹之類的數組結構。比如jdk 1.8之後的HashMap就是這樣優化的。
鏈地址法適用於場景。
基於鏈表的哈希沖突處理方法更適合存儲對象大、數據量大的哈希表,因為鏈表本身需要額外的空間來存儲指針地址,所以如果壹個節點存儲的數據沒有指針大,會造成很大的空間浪費;相反,如果指針大小相對於數據大小可以忽略,那麽使用鏈地址法解決沖突會是更好的選擇,鏈地址法會更加靈活,支持更多的優化策略。比如HashMap中的鏈表節點數大於8時,就會轉化為紅黑樹進行優化。
介紹了MD5碰撞的含義,以及處理哈希碰撞的方法:開放尋址法和鏈地址法。此外,還介紹了線性檢測法和鏈地址法的應用場景。通過上面的介紹,妳應該對這些問題有了壹定的了解,更多關於MD5的知識可以在之前的文章中找到。