加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby:我如何使用Hash获取多个键?

发布时间:2020-12-17 02:26:49 所属栏目:百科 来源:网络整理
导读:我正在使用5个字符串(协议,源IP和端口,目标IP和端口)并使用它们在散列中存储一些值.问题是如果IP或端口在源和目标之间切换,则密钥应该是相同的. 如果我在C#/ Java中这样做,无论我需要创建一个新类并覆盖hashcode()/ equals()方法,但这似乎容易出错,因为我已
我正在使用5个字符串(协议,源IP和端口,目标IP和端口)并使用它们在散列中存储一些值.问题是如果IP或端口在源和目标之间切换,则密钥应该是相同的.

如果我在C#/ Java中这样做,无论我需要创建一个新类并覆盖hashcode()/ equals()方法,但这似乎容易出错,因为我已经读过它了,我很想知道如果在这里有更好的选择.

解决方法

我正在直接复制Programming Ruby 1.9中的一段:

Hash keys must respond to the message hash by returning a hash code,and the hash code for a given key must not change. The keys used in hashes must also be comparable using eql?. If eql? returns true for two keys,then those keys must also have the same hash code. This means that certain classes (such as Array and Hash) can’t conveniently be used as keys,because their hash values can change based on their contents.

因此,您可以生成哈希,如[“#{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,source_ip,protocol)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读