< 返回版块

terrysco 发表于 2020-06-30 10:53

我想检查一个端口是否是常用端口,并且能获取到该端口对应的协议名称。看了一些文档,好像phf能满足需求,不知道有没有其他更简单有效的做法。

static KNOWN_PORTS: phf::Map<&'static str, &'static str> = phf_map! {
	"21"=>   "ftp",
	"22"=>    "SSH",
	"23"=>    "telnet",
	"25"=>    "SMTP",
	"66"=>    "Oracle SQL*NET?",
	"69"=>    "tftp",
	"80"=>    "http",
	"88"=>    "kerberos",
	"109"=>   "pop2",
	"110"=>   "pop3",
	"123"=>   "ntp",
	"137"=>   "netbios",
        // ....
}

评论区

写评论
xiaopengli89 2020-06-30 19:06

不如写到配置文件里,方便扩展

songzhi 2020-06-30 15:16

这样的话, 其实直接写成match语句是不是性能就不错, 我觉得编译器会优化的很好的, 这样写起码无依赖不会增加编译负担, 可读性也挺好

--
👇
terrysco: 本来是想用端口号的u16,但phf只有字符串

--
👇
songzhi: 既然是端口号,为啥要用字符串...标准库里用的也是数字呀,可以把键名换成数字类型的

作者 terrysco 2020-06-30 14:12

本来是想用端口号的u16,但phf只有字符串

--
👇
songzhi: 既然是端口号,为啥要用字符串...标准库里用的也是数字呀,可以把键名换成数字类型的

songzhi 2020-06-30 11:51

既然是端口号,为啥要用字符串...标准库里用的也是数字呀,可以把键名换成数字类型的

shaitao 2020-06-30 11:41

你这个已经很简洁了... 我自己做的, lazy_static一个字典, 一条条插入..

作者 terrysco 2020-06-30 11:15

我是问这种做法的rust最佳实践,不是追求性能的优化

--
👇
gwy15: 这构不成什么瓶颈吧,没啥好优化的啊……

实在要优化,端口一共就 65535,而且系统端口就 0~1023,直接开个 Vec<'static str> 会快一点。但是没啥必要在这种地方抠细节,省不了多少吧。

gwy15 2020-06-30 11:01

这构不成什么瓶颈吧,没啥好优化的啊……

实在要优化,端口一共就 65535,而且系统端口就 0~1023,直接开个 Vec<'static str> 会快一点。但是没啥必要在这种地方抠细节,省不了多少吧。

1 共 7 条评论, 1 页