Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit 7f9368d

Browse files
committed
binary search. Fix #4
1 parent 9552266 commit 7f9368d

File tree

3 files changed

+25
-54
lines changed

3 files changed

+25
-54
lines changed

docs/en.md

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,7 @@
1010
```text
1111
php composer.phar require ddrv/iptool
1212
```
13-
```json
14-
{
15-
"require": {
16-
"ddrv/iptool":"*"
17-
}
18-
}
19-
```
20-
2. Run in console
21-
```text
22-
php composer.phar install
23-
```
24-
3. Include autoload file
13+
2. Include autoload file
2514
```php
2615
include('vendor/autoload.php');
2716
```

docs/ru.md

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,7 @@
1010
```text
1111
php composer.phar require ddrv/iptool
1212
```
13-
```json
14-
{
15-
"require": {
16-
"ddrv/iptool":"*"
17-
}
18-
}
19-
```
20-
2. Установите пакет
21-
```text
22-
php composer.phar install
23-
```
24-
3. Подключите автозагрузку классов
13+
2. Подключите автозагрузку классов
2514
```php
2615
include('vendor/autoload.php');
2716
```

src/Iptool.php

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public function __construct($databaseFile)
8484
'dit' => $dit,
8585
'version' => $tmp['ver'],
8686
];
87-
if ($this->meta['version'] !== self::VERSION) {
87+
if ($this->meta['version'] != self::VERSION) {
8888
fclose($this->db);
8989
$this->errors[] = 'file '.$databaseFile.' is not database version '.self::VERSION;
9090
return;
@@ -137,7 +137,6 @@ public function find($ip)
137137
{
138138
if (!filter_var($ip, FILTER_VALIDATE_IP)) return false;
139139
if (!$this->isCorrect) return false;
140-
$registers = false;
141140
$data = array();
142141
$octet = (int)$ip;
143142
$long = pack('N',ip2long($ip));
@@ -159,38 +158,32 @@ public function find($ip)
159158
$seek = $this->meta['networks']['offset']+($start*$this->meta['networks']['len']);
160159
fseek($this->db,$seek);
161160
$blocks = fread($this->db,$blockCount*$this->meta['networks']['len']);
162-
$blocksLength = strlen($blocks);
163-
$offset = 0;
164-
if ($blockCount > 10) {
165-
$step = ceil(sqrt($blockCount));
166-
$check = substr($blocks, $offset + ($this->meta['networks']['len'] * $step), 4);
167-
while ($check && $long >= $check && ($offset < ($blockCount) * $this->meta['networks']['len'])) {
168-
$offset += $this->meta['networks']['len'] * $step;
169-
$check = substr($blocks, $offset + ($this->meta['networks']['len'] * $step), 4);
170-
}
171-
}
161+
$start = 0;
162+
$stop = $blockCount;
172163
do {
173-
if ($offset > $blocksLength) {
174-
$offset = $blocksLength-$this->meta['networks']['len'];
175-
}
176-
$block = substr($blocks,$offset,$this->meta['networks']['len']);
177-
$first = substr($block,0,4);
178-
$next = substr($blocks,$offset+$this->meta['networks']['len'],4);
179-
if ($first <= $long && ($long < $next || $next == false)) {
180-
$registers = unpack($this->meta['networks']['pack'],substr($block,4));
181-
}
182-
$offset += $this->meta['networks']['len'];
183-
} while($offset < strlen($blocks) && !$registers);
184-
if (!$registers) {
185-
foreach ($this->meta['registers'] as $r=>$register) {
186-
$registers[$r] = 0;
164+
$center = ($start + $stop) >> 1;
165+
$sc = substr($blocks, $center * $this->meta['networks']['len'], 4);
166+
if ($sc > $long) {
167+
$stop = $center;
168+
} else {
169+
$start = $center;
187170
}
171+
$blocksCount = $stop - $start;
172+
} while ($blocksCount >= 2);
173+
if ($long > $stop) {
174+
$start = $stop;
188175
}
189-
if (!$next) {
190-
$next = pack('N',ip2long('255.255.255.255')+1);
176+
$block = substr($blocks, $start * $this->meta['networks']['len'], $this->meta['networks']['len']);
177+
$network = unpack('Nfirst',substr($block,0,4));
178+
$data['network']['first'] = long2ip($network['first']);
179+
$next = substr($blocks,($start+1)*$this->meta['networks']['len'],4);
180+
if ($next) {
181+
$network = unpack('Nlast',$next);
182+
$data['network']['last'] = long2ip($network['last']);
183+
} else {
184+
$data['network']['last'] = '255.255.255.255';
191185
}
192-
$network = unpack('Nfirst/Nlast',$first.$next);
193-
$data['network'] = array(long2ip($network['first']),long2ip($network['last']-1));
186+
$registers = unpack($this->meta['networks']['pack'],substr($block,4));
194187
foreach ($registers as $register=>$item) {
195188
$data['data'][$register] = $this->getRegisterRecord($register,$item);
196189
}

0 commit comments

Comments
 (0)