2009-11-24 41 views
3

對象散列值的含義是什麼?在這種情況下,兩個對象具有相同的哈希值?另外據說Array | Hash不能是哈希鍵,這與對象的哈希值有關,爲什麼?ruby​​ object.hash

回答

10

對於對象存儲在包含HashMap或hashsets以下必須成立:

如果兩個對象被認爲是平等的,他們的哈希值也必須相等。

如果兩個對象不相同,它們的散列值應該可能不同(兩個不同的對象具有相同的散列值越頻繁,散列映射/集上的操作性能越差)。

因此,如果兩個對象具有相同的散列值,那麼它們是平等的(但不能保證)。

以上所說的「相等」意思是指哈希方法的實現者。但是,您應該始終使用eql?來使用與散列相同的相等定義。

對於不重寫散列的類(即使用Object的散列實現的類),散列相等性是根據對象標識定義的。即當且僅當駐留在內存中的相同位置時,兩個對象被認爲是相等的。

紅寶石達1.8.6陣列和哈希沒有覆蓋hash。因此,如果您使用數組(或散列)作爲散列鍵,那麼如果您使用完全相同的數組作爲檢索鍵(而不是具有相同內容的數組),則只能檢索鍵的值。

紅寶石1.8.7+ Array#hashHash#hash(以及它們的eql?方法)被定義爲當它們的元素相等時它們是相等的。

1

散列值沒有固有含義,但它是一種表示該對象的方式,以便它可以與其他相同類型的對象區分開來。當你創建一個對象時,它需要實現散列,這樣如果兩個對象具有相同的散列值,它們也將相等。兩個對象相等的意義取決於對象;如果您定義了一個Person對象,那麼您可能想要說,如果Person的兩個實例具有相同的名稱,ID號和出生日期,則它們是相等的。或者選擇任何標準。

將數組或散列用作散列鍵現在可以工作,因爲兩者都執行散列(例如散列值基於其內容)。但是,如果有可能修改它,則在使用可修改對象(如數組)作爲關鍵字時,可能會遇到麻煩。例如,如果您有一個Array類型的變量,並將其用作將某些內容放入哈希中的關鍵字,然後將某些內容添加到該數組中,並嘗試將該變量用作重新獲取某些內容的鍵的哈希,它不會工作(因爲數組的哈希值已更改)。解決此問題的方法是在修改陣列後,在您的散列上調用Rehash。

0

你在找什麼是hashing的概念。 這不僅僅是對象,更廣泛的概念。