Ruby:如何让 Hash 接受多个键?

zxc*_*bnm 6 ruby hash

我使用 5 个字符串(协议、源 IP 和端口、目标 IP 和端口)并使用它们将一些值存储在哈希中。问题是,如果 IP 或端口在源和目标之间切换,密钥应该是相同的。

如果我在 C#/Java/whatever 中执行此操作,我将不得不创建一个新类并覆盖 hashcode()/equals() 方法,但这似乎很容易出错,因为我读过的关于它的内容很少,我想知道如果这里有更好的选择。

Mar*_*off 7

我直接从Programming Ruby 1.9复制一段:

散列键必须hash通过返回散列代码来响应消息,并且给定键的散列代码不得更改。散列中使用的键也必须使用eql?. 如果eql?返回true两个键,则这些键也必须具有相同的哈希码。这意味着某些类(例如ArrayHash)不能方便地用作键,因为它们的散列值可以根据它们的内容而改变。

因此,您可能会生成类似["#{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)
Run Code Online (Sandbox Code Playgroud)

即使参数在两次调用之间的顺序不同,这也会输出相同的哈希值。将此功能正确封装到类中作为练习留给读者。