我使用 5 个字符串(协议、源 IP 和端口、目标 IP 和端口)并使用它们将一些值存储在哈希中。问题是,如果 IP 或端口在源和目标之间切换,密钥应该是相同的。
如果我在 C#/Java/whatever 中执行此操作,我将不得不创建一个新类并覆盖 hashcode()/equals() 方法,但这似乎很容易出错,因为我读过的关于它的内容很少,我想知道如果这里有更好的选择。
我直接从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)
Run Code Online (Sandbox Code Playgroud)
即使参数在两次调用之间的顺序不同,这也会输出相同的哈希值。将此功能正确封装到类中作为练习留给读者。
| 归档时间: |
|
| 查看次数: |
8676 次 |
| 最近记录: |