16个版本
使用旧的Rust 2015
0.6.7 | 2022年1月17日 |
---|---|
0.6.6 | 2021年11月7日 |
0.6.4 | 2021年5月18日 |
0.6.3 | 2020年5月13日 |
0.4.1 | 2017年11月2日 |
#126 in 网络编程
68,425 每月下载量
用于 21 个Crates (9 个直接)
62KB
1.5K SLoC
iprange-rs
iprange-rs
是一个用于管理IP范围的Rust库。
它提供快速添加和删除操作。
它还提供 merge
、intersect
和 exclude
方法,使您能够像操作集合一样操作它。
当然,您可以测试IP地址是否在 IpRange
中。
有关详细信息,请参阅 文档。
示例
extern crate iprange;
extern crate ipnet;
use std::net::Ipv4Addr;
use iprange::IpRange;
use ipnet::Ipv4Net;
fn main() {
let ip_range: IpRange<Ipv4Net> = ["10.0.0.0/8", "172.16.0.0/16", "192.168.1.0/24"]
.iter()
.map(|s| s.parse().unwrap())
.collect();
assert!(ip_range.contains(&"172.16.32.1".parse::<Ipv4Addr>().unwrap()));
assert!(ip_range.contains(&"192.168.1.1".parse::<Ipv4Addr>().unwrap()));
}
Serde支持
Serde支持是可选的,默认禁用。要启用,请使用特性 serde
。
[dependencies]
iprange = { version = "0.6", features = ["serde"] }
基准测试
iprange-rs
将IP网络存储在基数查找树中。这使我们能够快速存储和查找IP信息。
没有Rust的替代品,所以我决定将其与用Go编写的那些进行比较。
在我的计算机上,以下是 基准测试结果(Go实现)
BenchmarkIPv4Contains-8 500000 2545 ns/op
BenchmarkIPv4Contains_Radix-8 200000 6960 ns/op
BenchmarkIPv4Contains_NRadix-8 1000000 1828 ns/op
BenchmarkIPv6Contains-8 300000 3989 ns/op
BenchmarkIPv6Contains_Radix-8 200000 6818 ns/op
BenchmarkIPv6Contains_NRadix-8 500000 3039 ns/op
以下是使用 iprange-rs
的等效Rust程序的结果
test test_ipv4_against_go ... bench: 751 ns/iter (+/- 5)
test test_ipv6_against_go ... bench: 2,500 ns/iter (+/- 20)
我们可以看到,使用 iprange-rs
的Rust版本在处理IPv4时甚至比最快的Go实现快2.4倍,在IPv6时快1.2倍。
许可证
iprange-rs
使用MIT许可证。
依赖关系
~105–295KB