覆蓋雜湊函式

Ruby 雜湊使用方法 hasheql? 來執行雜湊操作,並將儲存在雜湊中的物件分配給內部雜湊箱。Ruby 中 hash 的預設實現是雜湊物件的所有成員欄位上的 雜音雜湊函式 。要覆蓋此行為,可以覆蓋 hasheql? 方法。

與其他雜湊實現一樣,如果 a.hash == b.hash 將兩個物件 a 和 b 雜湊到同一個桶中,如果 a.eql?(b) 將被視為相同。因此,當重新實現 hasheql? 時,應該注意確保如果 abeql? 下相等,則它們必須返回相同的 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