16 releases

Uses old Rust 2015

0.6.7 Jan 17, 2022
0.6.6 Nov 7, 2021
0.6.4 May 18, 2021
0.6.3 May 13, 2020
0.4.1 Nov 2, 2017

#103 in Network programming

Download history 7176/week @ 2023-11-20 8206/week @ 2023-11-27 11391/week @ 2023-12-04 11379/week @ 2023-12-11 9513/week @ 2023-12-18 5217/week @ 2023-12-25 8869/week @ 2024-01-01 9713/week @ 2024-01-08 9748/week @ 2024-01-15 10363/week @ 2024-01-22 14615/week @ 2024-01-29 15153/week @ 2024-02-05 15582/week @ 2024-02-12 14623/week @ 2024-02-19 14616/week @ 2024-02-26 17013/week @ 2024-03-04

63,016 downloads per month
Used in 21 crates (9 directly)

MIT license

62KB
1.5K SLoC

iprange-rs

Crates Version CI

iprange-rs is a Rust library for managing IP ranges.

It provides fast adding and removing operations.

It also provides merge, intersect and exclude methods that enable you to manipulate it like a set.

Of course, you can test whether an IP address is in an IpRange.

See the documentation for details.

Example

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 support

Serde support is optional and disabled by default. To enable, use the feature serde.

[dependencies]
iprange = { version = "0.6", features = ["serde"] }

Benchmark

iprange-rs stores the IP networks in a radix trie. This allows us to store and lookup IP information quickly.

There is no Rust alternative to this crate, so I decide to compare it to those written in Go.

On my computer, here is the benchmark result for Go implementations:

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

And below are the results of the equivalent Rust program using iprange-rs:

test test_ipv4_against_go             ... bench:         751 ns/iter (+/- 5)
test test_ipv6_against_go             ... bench:       2,500 ns/iter (+/- 20)

We can see the Rust one using iprange-rs is 2.4x faster than even the fastest Go implementation when dealing with IPv4 and is 1.2x faster with IPv6.

License

iprange-rs is licensed under the MIT license.

Dependencies

~105–295KB