您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Java中 hashCode() 方法如何使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
什么是 Hash
Hash 中文叫做哈希也可以叫做散列,使用 Hash 的算法生成字符串或者數字的方法就可以稱為 Hash 算法,或者散列算法。
如果還不太明白的話,考慮下 MD5。MD5 就是典型的哈希算法,通過 MD5 算法,不管你是輸入字符串,圖片,二進制文件,都能獲得一個字符串。
獲得這個字符串的算法就是 Hash 算法。
我們在這里不打算討論復雜的 Hash 算法或者 Hash 算法怎么去計算的。因為這樣的話,你可能需要很長的時間才能搞明白到底怎么算出來的。
使用 Hash 算法的目的就是為了將獲得的數據摘要信息盡量分散,并且盡量的不重復,同時還需要保證相同數據的 Hash 結果是相同不能變化的。
不管你將相同數據 Hash 多少遍,只要數據相同,那么 Hash 必須是相同的。
在現實生活中,不同數據的 Hash 結果可能是相同的。
考察下面的代碼:
logger.debug("HashCode AaAaAa - {}", "AaAaAa".hashCode());logger.debug("HashCode BBAaBB - {}", "BBAaBB".hashCode());
上面代碼輸出的結果是相同的,這種情況就是哈希碰撞( Hash collision)。
很遺憾,這種哈希碰撞在現實中是不能避免的。
常用的 Hash 算法有下面的一些算法。
MD5 的算法已經不是安全的 Hash 算法了,在密碼學和開發中,已經逐步推薦使用 SHA-256 算法了。
算法 | 輸出長度(位) | 輸出長度(字節) |
---|---|---|
MD5 | 128 bits | 16 bytes |
SHA-1 | 160 bits | 20 bytes |
RipeMD-160 | 160 bits | 20 bytes |
SHA-256 | 256 bits | 32 bytes |
SHA-512 | 512 bits | 64 bytes |
根據碰撞概率,哈希算法的輸出長度越長,就越難產生碰撞,也就越安全。
Java 中的 hashCode() 方法返回的數據類型是 int 類型。
下面以 String 對象的 hashCode 為例,官方解釋中有關 String 對象 Hash 算法計算方式是:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
針對輸入字符串是不是 UTF16,將會有不同的計算方法。
如果你不想使用 Java Object 對象中的 Hash 算法,你可以在你的對象中重寫 Hash 算法。
在 IntelliJ IDEA 輸入快捷鍵 Alt+Insert,這個將會彈出快速生成方法的選擇項。
隨后將會提示你選用何種方法來創建 hashCode() 方法。你可以選擇使用 JDK 自帶的,你也可以選擇使用 Apache Commons-lang 的方法來重寫方法。當然,你也可以使用其他的一些方法來寫,不管哪個方法來寫,原理都是相通的。
選擇變量,在完成上面的方法選擇后,將會提示你選擇變量。
將需要創建的變量選擇,然后下一步。
同時還需要你選擇非空的字段,你可以默認選擇也可以不選擇。
如下,你可以看到使用 JDK 生成的默認的 hashCode 方法。
@Overridepublic int hashCode() {return Objects.hash(title, topic_id, raw, category, target_recipients, archetype, created_at); }
如果你根據使用的是 Apache 的 Commons 生成的話,結果有所不同。
可以在 IDE 中自行研究下。
需要注意的是,在 hashCode 中,你可能會看到數字 17,31,37。
其實這些數字就是素數了,在 Java 面試的時候可能會有一道題目就是找出 100 以內的素數。
因為 Hash 算法在很多時候其實也可以用于密碼學中,密碼學的很多基礎研究就是對素數的研究。
網絡中廣泛使用的RSA算法,就是基于素數性質的重要應用。
因此在 hashCode 的方法中,你能看到上面的數字,這個就是有關素數算法的實際應用之一。因為涉及到很多密碼學的知識,我們這里就不實際展開了。
上述就是小編為大家分享的Java中 hashCode() 方法如何使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。