2个版本
0.1.1 | 2024年7月2日 |
---|---|
0.1.0 | 2024年3月5日 |
#1198 in 网络编程
38KB
667 行
读取libloc格式的位置数据库。
它具有对IPv6/IPv4地址到ASN和国家数据的常数时间查找("GeoIP")。数据库还包含AS和国家名称。
此crate的主要结构是Locations
。首先,您需要一个数据库。可以从https://location.ipfire.org/databases/1/location.db.xz获取最新的官方IPFire数据库,xz压缩版。然后您可以从Locations::open
开始,并使用Locations::lookup
查找特定IP地址的信息。
有关数据库格式的内部结构的简要概述,请参阅https://www.ipfire.org/blog/libloc-or-what-is-working-inside-it。在此存储库中可以找到Kaitai结构实现ipfire_libloc_db_v1.ksy
。
示例
use libloc::Locations;
let locations = Locations::open("example-location.db")?;
let network: libloc::Network = locations.lookup("2a07:1c44:5800::1".parse().unwrap()).unwrap();
assert_eq!(network.country_code(), "DE");
assert_eq!(network.asn(), 204867);
assert_eq!(network.is_anonymous_proxy(), false);
assert_eq!(network.addrs().to_string(), "2a07:1c44:5800::/40");
let country: libloc::Country = locations.country("DE").unwrap();
assert_eq!(country.continent_code(), "EU");
assert_eq!(country.name(), "Germany");
let as_: libloc::As = locations.as_(204867).unwrap();
assert_eq!(as_.name(), "Lightning Wire Labs GmbH");
# Ok::<(), libloc::OpenError>(())
恐慌
如果数据库损坏,此库中的任何函数都可能恐慌。
基准测试
此库是为了娱乐而编写的。即使它没有针对速度进行优化,它也比原始的libloc快得多。
Running benches/locations.rs
running 4 tests
test lookup ... bench: 87 ns/iter (+/- 15)
test lookup_v4 ... bench: 61 ns/iter (+/- 5)
test lookup_v6 ... bench: 396 ns/iter (+/- 22)
test open ... bench: 64,012 ns/iter (+/- 4,592)
test result: ok. 0 passed; 0 failed; 0 ignored; 4 measured
Running benches/native.rs
running 2 tests
test lookup_v6 ... bench: 1,019 ns/iter (+/- 128)
test open ... bench: 234,420 ns/iter (+/- 19,638)
test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured
查找IPv6地址的速度大约快2.5倍,它对IPv4地址有特殊的处理,使其速度快10倍以上。
依赖关系
~1–1.6MB
~22K SLoC