任何人都可以解釋這個散列函數背後的邏輯嗎?任何人都可以解釋這個散列函數背後的邏輯嗎?
static int hash(int h) {
h ^= (h >>> 20)^(h >>> 12);
return h^(h >>> 7)^(h >>> 4);
}
我通過key.hashCode()
這個函數給我的哈希值。根據這個值和數組大小,我計算數組的索引。我只是不瞭解此方法中使用的運算符。
- 這個
^
運算符在這種情況下做什麼。它是否檢查!= - 什麼是無符號右移>>>做?我們在Java中沒有Unsigned int的權利?
- 如何爲這個函數選擇20,12,7和4的值?是否預先定義了 或用戶定義?
傳遞給該散列函數的key.hashCode()
是79847235
。任何人都可以解釋裏面會發生什麼,以返回最終的哈希值。
已存在一個同樣的問題和答案,我掛:HTTP://計算器。 com/questions/9335169/understanding-strange-java-hash-function。由於這也是一個重複我想知道你爲什麼回答.... –
Ultimater,謝謝你的答案。我真的很想知道,爲什麼它特別是20,12,7和4.他們如何衡量隨機性。這裏的大多數答案都會介紹隨機性等等。它是如何創造這種隨機性的?爲什麼右邊的位置必須是20,爲什麼不能是21或19?你能解釋一下嗎?對不起,如果我錯過了一些基本的東西。 –
你也可以使用其他數字。如果您通過函數運行每個數字0到100 quadrillion,您會發現無論在函數中使用什麼數字,輸出中都不會有重複。這是因爲異或的性質。 2^5 = 7。 7^5 = 2。 2^7 = 5。如果你在循環中運行'i^2'(var i = 0; i <100; i ++)'並將結果存儲在一個數組中。你會看到該數組將包含每個數字0到99而不重複。 http://jsfiddle.net/e9v2D/。 因此,無論使用什麼數字,它都不會包含由於異或的觸發器行爲而導致的重複,如2,5和7所示。 – Ultimater