Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (php) Записть массива в btree / 9 сообщений из 9, страница 1 из 1
23.03.2013, 06:03
    #38195729
cromax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(php) Записть массива в btree
Добронй ночи, пытаюсь добавить/создать базу 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
23.03.2013, 19:17
    #38196019
Герой дня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(php) Записть массива в btree
наверное, начинать надо с верхнего уровня, а далее - переходить на следующий уровень и тп
...
Рейтинг: 0 / 0
23.03.2013, 21:36
    #38196098
Герой дня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(php) Записть массива в btree
имею в виду - строить массив, то есть нужно несколько проходов по исходнику
...
Рейтинг: 0 / 0
23.03.2013, 21:53
    #38196105
cromax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(php) Записть массива в btree
ничего не выходит, бесит уж... надо оттдохнуть (
что только не пробовал, и дерево строил, и массив....
чето несходится (
...
Рейтинг: 0 / 0
23.03.2013, 22:06
    #38196113
cromax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(php) Записть массива в btree
вот как ищет страну 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
24.03.2013, 02:06
    #38196261
Герой дня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(php) Записть массива в btree
...
Рейтинг: 0 / 0
24.03.2013, 03:01
    #38196278
cromax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(php) Записть массива в btree
Герой дня,
там про запись btree дерева в geoip.dat ничего нет даже отдаленно
...
Рейтинг: 0 / 0
25.03.2013, 18:08
    #38197768
cromax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(php) Записть массива в btree
Разобрался с записью, обычное бинарное дерево, над его только правильно сохранить.
Спасибо ))
...
Рейтинг: 0 / 0
25.03.2013, 19:33
    #38197876
artas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(php) Записть массива в btree
cromax,

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


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