我直接从《Programming Ruby 1.9》一段文字中复制了一个段落:
哈希键必须响应消息 `hash` 并返回哈希码,给定键的哈希码不能更改。 哈希中使用的键还必须使用 `eql?` 进行比较。 如果两个键的 `eql?` 返回 `true`,则这些键的哈希码也必须相同。 这意味着某些类(例如 Array 和 Hash)不能方便地用作键,因为它们的哈希值可以根据其内容而变化。
因此,您可以生成这样的哈希表:`["#{source_ip} #{source_port}", "#{dest_ip} #{dest_port}", protocol.to_s].sort.join.hash`,使得当源和目标互换时结果是相同的。
例如:
source_ip = "1.2.3.4"
source_port = 1234
dest_ip = "5.6.7.8"
dest_port = 5678
protocol = "http"
def make_hash(s_ip, s_port, d_ip, d_port, proto)
["#{s_ip} #{s_port}", "#{d_ip} #{d_port}", proto.to_s].sort.join.hash
end
puts make_hash(source_ip, source_port, dest_ip, dest_port, protocol)
puts make_hash(dest_ip, dest_port, source_ip, source_port, protocol)
即使两次调用的参数顺序不同,这将输出相同的哈希值。正确地封装此功能到类中留给读者作为练习。
{:a => "foo", :b => "bar"}
)。而是你希望在某些情况下,两个具有相同键但不同值的哈希表仍然可以被视为相等。是这样吗? - John Feminella