powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (php) Записть массива в btree
9 сообщений из 9, страница 1 из 1
(php) Записть массива в btree
    #38195729
cromax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добронй ночи, пытаюсь добавить/создать базу GeoIP.dat свои IP. Сижу 2ю ночь....

С форматом вроде разобрался, в двух словах следущий

Код: plaintext
1.
2.
3.
4.
5.
 
   node
    /\
node  node
  /    \
node  node

каждая нода занимает 6 байт и состоит из двух значений(next node L и next node R); если нода > 16776960, это страна, если нет - то ссылка на следующую ноду.
при поиске страны по IP адрессу - geoIP сравнивает первый бит IP адресса с 1й нодой в дереве, и если он стоит прыгает влево по 1му значению ноды, если не стоит в право по второму, если значение ноды > 16776960 то IP найден.

допустим есть 2 -3 IP
1.0.32.0/19
212.163.0.0/25
212.163.0.128/26

надо каждый перевести в long, пробежаться по первый 19 битам в случаее с 1м IP - это все ясно
а дальше как быть не пойму. )
как построить(записать) такое Bдерево?
...
Рейтинг: 0 / 0
(php) Записть массива в btree
    #38196019
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное, начинать надо с верхнего уровня, а далее - переходить на следующий уровень и тп
...
Рейтинг: 0 / 0
(php) Записть массива в btree
    #38196098
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имею в виду - строить массив, то есть нужно несколько проходов по исходнику
...
Рейтинг: 0 / 0
(php) Записть массива в btree
    #38196105
cromax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ничего не выходит, бесит уж... надо оттдохнуть (
что только не пробовал, и дерево строил, и массив....
чето несходится (
...
Рейтинг: 0 / 0
(php) Записть массива в btree
    #38196113
cromax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот как ищет страну GeoIP -


Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
function db( $b ) {Return sprintf("%032b", $b);}
function _geoip_seek_country1($ff, $ipnum) {

  $offset = 0;
  for ($depth = 31; $depth >= 0; --$depth) {

	print 'Jump to:'.$offset."(".(2 * 3/*$gi->record_length*/  * $offset).")"."\n";

	fseek($ff, 2 * 3/*$gi->record_length*/  * $offset, SEEK_SET) == 0 or die("fseek failed");
	$buf = fread($gi->filehandle, 2 * 3/*$gi->record_length*/);

	print 'buf:'.$buf."\n";

	//преобразовывает из binary в unsigned long
	//$x[0] = left, $x[1] = right, или наобоорт
	$x = array(0,0);
    for ($i = 0; $i < 2; ++$i) {
      for ($j = 0; $j < 3/*$gi->record_length*/; ++$j) {
        $x[$i] += ord($buf[3/*$gi->record_length*/ * $i + $j]) << ($j * 8);
		print "x[$i]+= buf[".(3/*$gi->record_length*/ * $i + $j)."] - ".db(ord($buf[3/*$gi->record_length*/ * $i + $j])).' << '.($j * 8)." = ".(ord($buf[3/*$gi->record_length*/ * $i + $j]) << ($j * 8))."\n";
      }
    }
	
	print "Depth : $depth, ".db($ipnum).", ".db(1 << $depth).', '.db($ipnum & (1 << $depth)).', '.($ipnum & (1 << $depth)).',,'.$x[1].', '.$x[0]."\n";

    if ($ipnum & (1 << $depth)) { //сравнивает бит
      if ($x[1] >= 16776960) { // = GEOIP_COUNTRY_BEGIN =  16776960
        return $x[1]; //нашел страну
      }
      $offset = $x[1]; //перепрыгнуть на x[1]
    } else {
      if ($x[0] >= 16776960) {
        return $x[0]; //нашел страну
      }
      $offset = $x[0]; //перепрыгнуть на x[1]
    }

  }
}

$ff = fopen('GeoIP.dat','r');
$ipnum = ip2long('1.0.0.0');
$countryID = _geoip_seek_country1($ff, $ipnum) - 16776960;
...
Рейтинг: 0 / 0
(php) Записть массива в btree
    #38196261
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
(php) Записть массива в btree
    #38196278
cromax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Герой дня,
там про запись btree дерева в geoip.dat ничего нет даже отдаленно
...
Рейтинг: 0 / 0
(php) Записть массива в btree
    #38197768
cromax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался с записью, обычное бинарное дерево, над его только правильно сохранить.
Спасибо ))
...
Рейтинг: 0 / 0
(php) Записть массива в btree
    #38197876
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cromax,

btree != бинарное дерево
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (php) Записть массива в btree
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]