diff --git a/binding/rust/Cargo.toml b/binding/rust/Cargo.toml index 433c81d9269f200ea737a5103ed5e73e489126c3..5cf4568503b956fc264c848a6e370874e934f783 100644 --- a/binding/rust/Cargo.toml +++ b/binding/rust/Cargo.toml @@ -1,2 +1,2 @@ [workspace] -members = ["example", "ip2region2"] +members = ["example", "xdb"] diff --git a/binding/rust/ReadMe.md b/binding/rust/ReadMe.md index 66ceb735fd2c9bf519ef972e15719531207b5507..fe31b8a6470da9dee16f735e71fffd46c1915e7e 100644 --- a/binding/rust/ReadMe.md +++ b/binding/rust/ReadMe.md @@ -23,7 +23,7 @@ ```toml [dependencies] -ip2region2 = { git = "https://github.com/lionsoul2014/ip2region.git", branch = "master" } +xdb = { git = "https://github.com/lionsoul2014/ip2region.git", branch = "master" } # 用于生成随机数 rand = "0.8" # 用于初始化日志打印 @@ -42,7 +42,7 @@ use std::net::Ipv4Addr; use std::thread; use std::time::{Duration, Instant}; -use ip2region2::{search_by_ip, searcher_init}; +use xdb::{search_by_ip, searcher_init}; fn main() { // 配置输出日志信息 @@ -103,7 +103,7 @@ fn main() { Compiling ip-test v0.1.0 (/home/gong/rust-work/ip-test) Finished release [optimized] target(s) in 0.27s Running `target/release/ip-test` -2022-12-24T03:31:22.921958Z DEBUG ip2region2::searcher: load xdb searcher file at ./ip2region.xdb +2022-12-24T03:31:22.921958Z DEBUG xdb::searcher: load xdb searcher file at ./ip2region.xdb 测试多类型查询 0|0|0|内网IP|内网IP @@ -131,7 +131,7 @@ use std::time::Instant; use tokio::sync::mpsc; -use ip2region2::{search_by_ip, searcher_init}; +use xdb::{search_by_ip, searcher_init}; #[tokio::main] async fn main() { @@ -171,7 +171,7 @@ $ RUST_LOG=debug cargo run -r Compiling ip-test v0.1.0 (/home/gong/rust-work/ip-test) Finished release [optimized] target(s) in 0.51s Running `target/release/ip-test` -2022-12-24T04:05:32.876664Z DEBUG ip2region2::searcher: load xdb searcher file at ./ip2region.xdb +2022-12-24T04:05:32.876664Z DEBUG xdb::searcher: load xdb searcher file at ./ip2region.xdb tokio spawn 4 over cost: 1.133448675s, ave: 113ns tokio spawn 2 over cost: 1.133938619s, ave: 113ns tokio spawn 1 over cost: 1.136872027s, ave: 113ns @@ -183,7 +183,7 @@ tokio spawn 3 over cost: 1.26446099s, ave: 126ns # `binding/rust`路径下面的结构说明 -`ip2region2` +`xdb` - 封装了`ip`到`region`的函数 - 里面包含单元测试和`benchmark`测试 @@ -311,7 +311,7 @@ $ cargo test 需要保证查询速度不会有大幅降低,希望有朝一日,远方的朋友可以再深度优化一下,实现几十纳秒级别的查询速度 -下面是`ip2region2`库的第一版`benchmark`结果 +下面是`rust/xdb`库的第一版`benchmark`结果 重点关注如下 diff --git a/binding/rust/example/Cargo.toml b/binding/rust/example/Cargo.toml index 952f0c20022bf7f8c252ed9dcbea8956f42db7c7..8fd74245c242409986fc79d036f66a8784d35546 100644 --- a/binding/rust/example/Cargo.toml +++ b/binding/rust/example/Cargo.toml @@ -10,7 +10,7 @@ license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -ip2region2 = { path = "../ip2region2" } +xdb = { path = "../xdb" } clap = { version = "4.0" } tracing = "0.1" tracing-subscriber = "0.3.14" diff --git a/binding/rust/example/src/main.rs b/binding/rust/example/src/main.rs index cced30c4360737d83cd2ba3f4c86ae75914ba688..2578ab5c30e0323fac5df544d0cb1c64c57675bf 100644 --- a/binding/rust/example/src/main.rs +++ b/binding/rust/example/src/main.rs @@ -9,7 +9,7 @@ use std::time::Instant; use clap::ArgMatches; -use ip2region2::{search_by_ip, searcher_init}; +use xdb::{search_by_ip, searcher_init}; mod cmd; diff --git a/binding/rust/ip2region2/Cargo.toml b/binding/rust/xdb/Cargo.toml similarity index 95% rename from binding/rust/ip2region2/Cargo.toml rename to binding/rust/xdb/Cargo.toml index 07c7b1b3e53ca60d86e19888557a7532dee691af..2d10ef753024195d41de16d23535d4d3c1f28377 100644 --- a/binding/rust/ip2region2/Cargo.toml +++ b/binding/rust/xdb/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "ip2region2" +name = "xdb" version = "0.1.0" edition = "2021" rust-version = "1.66.0" diff --git a/binding/rust/ip2region2/benches/search.rs b/binding/rust/xdb/benches/search.rs similarity index 97% rename from binding/rust/ip2region2/benches/search.rs rename to binding/rust/xdb/benches/search.rs index 52051f1769eeea0ae38f3dbfb84111bd6234e3a4..34102cec23b5af53ba87e0d6cd9b4f44124266c7 100644 --- a/binding/rust/ip2region2/benches/search.rs +++ b/binding/rust/xdb/benches/search.rs @@ -1,7 +1,7 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; use rand; -use ip2region2::searcher::{ +use xdb::searcher::{ get_block_by_size, get_full_cache, get_vector_index_cache, search_by_ip, searcher_init, }; diff --git a/binding/rust/ip2region2/src/ip_value.rs b/binding/rust/xdb/src/ip_value.rs similarity index 100% rename from binding/rust/ip2region2/src/ip_value.rs rename to binding/rust/xdb/src/ip_value.rs diff --git a/binding/rust/ip2region2/src/lib.rs b/binding/rust/xdb/src/lib.rs similarity index 100% rename from binding/rust/ip2region2/src/lib.rs rename to binding/rust/xdb/src/lib.rs diff --git a/binding/rust/ip2region2/src/searcher.rs b/binding/rust/xdb/src/searcher.rs similarity index 97% rename from binding/rust/ip2region2/src/searcher.rs rename to binding/rust/xdb/src/searcher.rs index f7dc20b4d9c98708ba881917f986173f11555d37..cc57be058bad50ee6eebf4661e559facf27cf2b8 100644 --- a/binding/rust/ip2region2/src/searcher.rs +++ b/binding/rust/xdb/src/searcher.rs @@ -24,7 +24,13 @@ where T: ToUIntIP + Display, { let ip = ip.to_u32_ip()?; - let (start_ptr, end_ptr) = get_start_end_ptr(ip); + let il0 = ((ip >> 24) & 0xFF) as usize; + let il1 = ((ip >> 16) & 0xFF) as usize; + let idx = VECTOR_INDEX_SIZE * (il0 * VECTOR_INDEX_COLS + il1); + let start_point = idx; + let vector_cache = get_vector_index_cache(); + let start_ptr = get_block_by_size(vector_cache, start_point, 4); + let end_ptr = get_block_by_size(vector_cache, start_point + 4, 4); let mut left: usize = 0; let mut right: usize = (end_ptr - start_ptr) / SEGMENT_INDEX_SIZE; @@ -49,17 +55,6 @@ where Err("not matched".into()) } -pub fn get_start_end_ptr(ip: u32) -> (usize, usize) { - let il0 = ((ip >> 24) & 0xFF) as usize; - let il1 = ((ip >> 16) & 0xFF) as usize; - let idx = VECTOR_INDEX_SIZE * (il0 * VECTOR_INDEX_COLS + il1); - let start_point = idx; - let vector_cache = get_vector_index_cache(); - let start_ptr = get_block_by_size(vector_cache, start_point, 4); - let end_ptr = get_block_by_size(vector_cache, start_point + 4, 4); - (start_ptr, end_ptr) -} - /// it will check ../data/ip2region.xdb, ../../data/ip2region.xdb, ../../../data/ip2region.xdb fn default_detect_xdb_file() -> Result> { let prefix = "../".to_owned();