ip2location_bin_format/index/
mod.rs

1use std::net::{Ipv4Addr, Ipv6Addr};
2
3//
4pub const INDEX_LEN: u32 = 524288;
5pub const INDEX_ELEMENT_LEN: u32 = 4;
6
7//
8pub mod builder;
9pub mod querier;
10
11pub use querier::{V4Querier, V6Querier};
12
13//
14pub fn ipv4_addr_position(ip: Ipv4Addr) -> u32 {
15    // https://github.com/ip2location/ip2proxy-rust/blob/5bdd3ef61c2e243c1b61eda1475ca23eab2b7240/src/db.rs#L190
16    (u32::from(ip) >> 16) << 3
17}
18
19pub fn ipv6_addr_position(ip: Ipv6Addr) -> u32 {
20    // https://github.com/ip2location/ip2proxy-rust/blob/5bdd3ef61c2e243c1b61eda1475ca23eab2b7240/src/db.rs#L217-L218
21    ((ip.octets()[0] as u32) * 256 + (ip.octets()[1] as u32)) << 3
22}
23
24#[cfg(test)]
25pub fn v4_index_len() -> u32 {
26    // https://github.com/ip2location/ip2proxy-rust/blob/5bdd3ef61c2e243c1b61eda1475ca23eab2b7240/src/db.rs#L191-L192
27    ipv4_addr_position(Ipv4Addr::new(255, 255, 255, 255)) + INDEX_ELEMENT_LEN + INDEX_ELEMENT_LEN
28}
29
30#[cfg(test)]
31pub fn v6_index_len() -> u32 {
32    // https://github.com/ip2location/ip2proxy-rust/blob/5bdd3ef61c2e243c1b61eda1475ca23eab2b7240/src/db.rs#L219-L220
33    ipv6_addr_position(Ipv6Addr::new(
34        0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
35    )) + INDEX_ELEMENT_LEN
36        + INDEX_ELEMENT_LEN
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn test_index_len() {
45        assert_eq!(v4_index_len(), INDEX_LEN);
46        assert_eq!(v6_index_len(), INDEX_LEN);
47    }
48}