<commit_before>ip2region - 最自由的ip地址查询库，ip到地区的映射库，提供Binary,B树和纯内存三种查询算法，妈妈再也不用担心我的ip地址定位。

### 1. 99.9%准确率，定时更新：

数据聚合了一些知名ip到地名查询提供商的数据，这些是他们官方的的准确率，经测试着实比纯真啥的准确多了。<br />
每次聚合一下数据需要1-2天，会不定时更新。

### 2. 标准化的数据格式：

每条ip数据段都固定了格式：_城市Id|国家|区域|省份|城市|ISP_

只有中国的数据精确到了城市，其他国家只能定位到国家，后前的选项全部是0，已经包含了全部你能查到的大大小小的国家。
（请忽略前面的城市Id，个人项目需求）

### 3. 体积小：

生成的数据库文件ip2region.db只有1.5M（1.2版本前是3.5M）

### 4. 多查询客户端的支持，0.0x毫秒级别的查询

已经集成的客户端有：java, C#, php, c, python，nodejs，php扩展(支持linux, php5, php7版本已支持)，golang。

    提供了两种查询算法，响应时间如下：
    客户端/binary算法/b-tree算法/Memory算法：
    c#/0.x毫秒/0.x毫秒/0.x毫秒
    java/0.x毫秒/0.x毫秒/0.1x毫秒 (使用RandomAccessFile)
    php/0.x毫秒/0.1x毫秒/0.1x毫秒
    c/0.0x毫秒/0.0x毫秒/0.00x毫秒(b-tree算法基本稳定在0.02x毫秒级别)
    python/0.x毫秒/0.1x毫秒/未知

任何客户端b-tree都比binary算法快，当然Memory算法固然是最快的！

maven仓库地址：
```xml
<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>1.4</version>
</dependency>
```
nuget安装命令
```shell
Install-Package IP2Region
```

### 5. 测试程序：
c#:
```shell
cd IP2Region_ConsoleTest
dotnet run
example result:
请输入IP地址：
172.16.31.10
```

java: 
```shell
cd binding/java
ant all
java -jar ip2region-{version}.jar ./data/ip2region.db
```

php: 
```shell
php binding/php/testSearcher.php ./data/ip2region.db
```

c: 
```shell
cd binding/c/
gcc -g -O2 testSearcher.c ip2region.c
./a.out ../../data/ip2region.db
```

python: 
```shell
python binding/python/testSearcher.py ./data/ip2region.db
```

均会看到如下界面：
```shell
initializing  B-tree ... 
+----------------------------------+<commit_msg>add nodejs sampale<commit_after>ip2region - 最自由的ip地址查询库，ip到地区的映射库，提供Binary,B树和纯内存三种查询算法，妈妈再也不用担心我的ip地址定位。

### 1. 99.9%准确率，定时更新：

数据聚合了一些知名ip到地名查询提供商的数据，这些是他们官方的的准确率，经测试着实比纯真啥的准确多了。<br />
每次聚合一下数据需要1-2天，会不定时更新。

### 2. 标准化的数据格式：

每条ip数据段都固定了格式：_城市Id|国家|区域|省份|城市|ISP_

只有中国的数据精确到了城市，其他国家只能定位到国家，后前的选项全部是0，已经包含了全部你能查到的大大小小的国家。
（请忽略前面的城市Id，个人项目需求）

### 3. 体积小：

生成的数据库文件ip2region.db只有1.5M（1.2版本前是3.5M）

### 4. 多查询客户端的支持，0.0x毫秒级别的查询

已经集成的客户端有：java, C#, php, c, python，nodejs，php扩展(支持linux, php5, php7版本已支持)，golang。

    提供了两种查询算法，响应时间如下：
    客户端/binary算法/b-tree算法/Memory算法：
    c#/0.x毫秒/0.x毫秒/0.x毫秒
    java/0.x毫秒/0.x毫秒/0.1x毫秒 (使用RandomAccessFile)
    php/0.x毫秒/0.1x毫秒/0.1x毫秒
    c/0.0x毫秒/0.0x毫秒/0.00x毫秒(b-tree算法基本稳定在0.02x毫秒级别)
    python/0.x毫秒/0.1x毫秒/未知

任何客户端b-tree都比binary算法快，当然Memory算法固然是最快的！

maven仓库地址：
```xml
<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>1.4</version>
</dependency>
```
nuget安装命令
```shell
Install-Package IP2Region
```

### 5. 测试程序：
c#:
```shell
cd IP2Region_ConsoleTest
dotnet run
example result:
请输入IP地址：
172.16.31.10
```

node:
```
> let ip2region = require('./ip2region.js');
> let dbService = ip2region.create('./ip2region.db');
> dbService.binarySearchSync(' 172.16.31.10')
{ city: 0, region: '中国|0|广东|深圳|鹏博士' }
```

java: 
```shell
cd binding/java
ant all
java -jar ip2region-{version}.jar ./data/ip2region.db
```

php: 
```shell
php binding/php/testSearcher.php ./data/ip2region.db
```

c: 
```shell
cd binding/c/
gcc -g -O2 testSearcher.c ip2region.c
./a.out ../../data/ip2region.db
```

python: 
```shell
python binding/python/testSearcher.py ./data/ip2region.db
```

均会看到如下界面：
```shell
initializing  B-tree ... 
+----------------------------------+
{'fraction_non_alphanumeric': 0.19100091827364554, 'fraction_numerical': 0.046831955922865015, 'mean_word_length': 4.035439137134053, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 24, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 3, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2030976', 'n_tokens_mistral': 2022, 'n_tokens_neox': 2136, 'n_words': 195}