覆蓋雜湊函式
Ruby 雜湊使用方法 hash
和 eql?
來執行雜湊操作,並將儲存在雜湊中的物件分配給內部雜湊箱。Ruby 中 hash
的預設實現是雜湊物件的所有成員欄位上的 雜音雜湊函式 。要覆蓋此行為,可以覆蓋 hash
和 eql?
方法。
與其他雜湊實現一樣,如果 a.hash == b.hash
將兩個物件 a 和 b 雜湊到同一個桶中,如果 a.eql?(b)
將被視為相同。因此,當重新實現 hash
和 eql?
時,應該注意確保如果 a
和 b
在 eql?
下相等,則它們必須返回相同的 hash
值。否則,這可能會導致雜湊中出現重複條目。相反,hash
實現中的不良選擇可能會導致許多物件共享相同的雜湊桶,從而有效地破壞 O(1)
查詢時間並導致 O(n)
在所有物件上呼叫 eql?
。
在下面的示例中,只有類 A
的例項儲存為鍵,因為它首先新增:
class A
def initialize(hash_value)
@hash_value = hash_value
end
def hash
@hash_value # Return the value given externally
end
def eql?(b)
self.hash == b.hash
end
end
class B < A
end
a = A.new(1)
b = B.new(1)
h = {}
h[a] = 1
h[b] = 2
raise "error" unless h.size == 1
raise "error" unless h.include? b
raise "error" unless h.include? a