Latest posts on сравнение ip адресов topichttp://python.su/forum/topic/962/2008-10-22T04:20:34+03:00Общий :: Python для экспертов :: сравнение ip адресов
2008-10-22T04:20:34+03:00shiza18489<a href="http://code.google.com/p/ipaddr-py/">http://code.google.com/p/ipaddr-py/</a>
Общий :: Python для экспертов :: сравнение ip адресов
2007-07-03T22:10:37+03:00shiza6387Упс. Сори. Только сейчас братил внимание на то что нужно с диапазонами.
Общий :: Python для экспертов :: сравнение ip адресов
2007-07-03T22:06:47+03:00shiza6386Я так поступал:<br/>Преобразование IP из строки в целое:<br/><div class="code"><pre>IpInt = struct.unpack('!L',socket.inet_aton(IpStr))[0]</pre></div>Преобразование IP из целого в строку:<br/><div class="code"><pre>IpStr = socket.inet_ntoa(struct.pack('!L', IpInt)</pre></div>Оба используемых модуля стандратные, и сишные. Поетому преобразование - довольно быстрое ( на моей машине 10000 преобразований - за 0.01 сек).<br/><br/>Преобразование - взаимооднозначное. Скорость сравнение интов - думаю рулит, по сравнению со всеми прочими.<br/>Инты пожно сравнивать напрямую и на больше, меньше:<br/><br/><div class="code"><pre>print struct.unpack('!L',socket.inet_aton('0.0.0.0'))[0]<br/>print struct.unpack('!L',socket.inet_aton('192.168.0.0'))[0]<br/>print struct.unpack('!L',socket.inet_aton('192.168.0.1'))[0]<br/>print struct.unpack('!L',socket.inet_aton('255.255.255.255'))[0]<br/>--------------------------------------------------<br/>0<br/>3232235520<br/>3232235521<br/>4294967295</pre></div>
Общий :: Python для экспертов :: сравнение ip адресов
2007-07-03T19:18:22+03:00Андрей Светлов6378И все таки советую собрать быстро прототип на какой-нибудь готовой либе. <br/>Начальству показать и т.д.<br/>А потом можно будет долго и весело поиск ускорять.
Общий :: Python для экспертов :: сравнение ip адресов
2007-07-03T18:59:10+03:00dem6376<blockquote><em>Андрей Светлов</em><br/>Если серьезно повышать скорость - следует делать дерево. Только лучше не совсем бинарное. Обычно в диапазонах первые три байта - целые (в смысле маска 255.255.255.ххх). Начало можно находить быстро (в три приема будет оптимальней, чем большой сортированный список), а хвост уже побитно смотреть. Легко перейти к более общему виду - учесть маски 255.255.ххх.ххх, 255.ххх.ххх.ххх и т.д.<br/>Простой bisort по большому списку будет, думаю, медленней.<br/>Еще можно это все на плюсах сделать - поиск имеет все шансы ускориться.<br/><br/>Честно говоря, не помню, как устроены IPy и iplib - может, что-то такое в них и есть.<br/>Я такую реализацию видел где-то на плюсах. Где - уже не вспомню.</blockquote>Наверное прийдется вспоминать С. Либо юзать inet_type in PostgreSQL. Кстати там эта функция отлично реализована. <br/>т/е выражения вида 10.0.0.0/24 >> 10.0.0.54 выдает True, но с переносимостью сами понимаете…
Общий :: Python для экспертов :: сравнение ip адресов
2007-07-03T18:49:33+03:00Андрей Светлов6375Если серьезно повышать скорость - следует делать дерево. Только лучше не совсем бинарное. Обычно в диапазонах первые три байта - целые (в смысле маска 255.255.255.ххх). Начало можно находить быстро (в три приема будет оптимальней, чем большой сортированный список), а хвост уже побитно смотреть. Легко перейти к более общему виду - учесть маски 255.255.ххх.ххх, 255.ххх.ххх.ххх и т.д.<br/>Простой bisort по большому списку будет, думаю, медленней.<br/>Еще можно это все на плюсах сделать - поиск имеет все шансы ускориться.<br/><br/>Честно говоря, не помню, как устроены IPy и iplib - может, что-то такое в них и есть.<br/>Я такую реализацию видел где-то на плюсах. Где - уже не вспомню.
Общий :: Python для экспертов :: сравнение ip адресов
2007-07-03T18:14:57+03:00dem6374IPy не умеет сравнивать диапазоны. <br/>а в таком виде и так 2000 диапазонов… вообще не весело и не пролетает!<br/><br/>при пересчете статистики с NetFlow, вы представляете сколько таких сравнений может быть в цикле? Но в корне будет именно эта операция, а значит ее нужно максимально оптимизировать.<br/><br/><br/>Я вот думаю перегонять весь список диапазонов в сортированный спискок бинарных ip.<br/>И за тем с ним сравнивать опять таки бинарный ип…. Но стоит ли овчинка?
Общий :: Python для экспертов :: сравнение ip адресов
2007-07-03T17:07:27+03:00Андрей Светлов6369А какие рамки по производительности?<br/>Мерял? Не хватало?<br/>По моему 2000 диапазонов отстрелятся почти мгновенно - не миллион же.<br/>IPy - вполне приличная вещь. Есть еще iplib. Дело вкуса
Общий :: Python для экспертов :: сравнение ip адресов
2007-07-03T16:50:10+03:00dem6367Нужно работать с большими списками ip адрессов UA-AIX ~ 1900 диапазонов.<br/><br/>выборка в стиле:<br/><br/>“ есть ip в списке этих диапазонов - или нет? ” <br/><br/>плюс есть требование по производительности решения. <br/><br/>Пока смотрю на IPy, но вдруг комрады подскажут чего? По сути задача сводится к поиску в бинарном массиве.