Как бы вы сравнили IP-адрес?

13
задан MrValdez 2 October 2008 в 15:18
поделиться

12 ответов

Зависит, какой язык Вы используете, но IP-адрес обычно хранится как 32-разрядное целое число без знака, по крайней мере, на сетевом уровне, делая сравнения довольно быстро. Даже если это не будет, если Вы не разработаете высокопроизводительное приложение коммутации пакетов, то это вряд ли будет узкое место производительности. Избегайте, чтобы преждевременная оптимизация - разработала Вашу программу для тестируемости и масштабируемости и если у Вас есть проблемы производительности тогда, можно использовать профилировщика для наблюдения, где узкие места.

Редактирование: для разъяснения адреса IPv4 хранятся как 32-разрядные целые числа плюс сетевая маска (который не необходим для сравнений IP-адреса). Если Вы будете использовать более новый и в настоящее время более редкий IPv6, то адреса будут 128 битов длиной.

29
ответ дан sk. 2 October 2008 в 15:18
поделиться

Вы имеете в виду, необходимо ли сравнить его как текстовую строку или преобразовать интервал в интервал и выдержать сравнение как интервал?

Это обычно не узкое место в этом виде поисков. можно просто попытаться реализовать оба метода и видеть, какой работает быстрее.

реальная проблема с поиском IP-адреса обычно делает эффективные запросы, используя в своих интересах то, что Вы имеете дело с IP-адресами и не просто случайными числами. для выполнения этого, Вы можете поиск LC trie и возможно эта статья

, Очевидно, это должно заинтересовать Вас, только если Ваш черный список содержит десятки тысяч или миллионы записей. Если это имеет только 10-20 записей, линейный поиск должен быть предпочтен, и действительно более интересным вопросом является текстовое сравнение по сравнению с целочисленным сравнением.

5
ответ дан shoosh 2 October 2008 в 15:18
поделиться
  • 1
    для меня на человечности это создавало .inputrc - который работал! Спасибо! – Brad Parks 20 January 2011 в 13:24

Используйте инструмент как PeerGuardian, который запрещает входящие соединения TCP/IP на уровне драйвера к дюйм/с на черном списке. Очень безопасный, никакой требуемый код (возможно: очень безопасный, , потому что никакой требуемый код).

3
ответ дан yfeldblum 2 October 2008 в 15:18
поделиться

У Вас есть существующая проблема с эффективностью?

Раз так тогда любой ценой отправляют код (или псевдокод), и мы можем выбрать в трупе.

, Если не тогда я предложил бы пробовать что-то простое как хранение записей в отсортированном списке и использования Вашей среды, существующей Sort() и Find().

2
ответ дан Mark Glorie 2 October 2008 в 15:18
поделиться
  • 1
    D' о! Это сделало бы это. Я могу на самом деле изменить это так, чтобы Учетная запись has_one: владелец и Пользователь belong_to: owned_account или: команда или что-то, и установленный внешний ключ. – Billy Gray 21 August 2009 в 19:11

Да я нашел, что, чтобы быть эффективным, это будет длинное, хотя, и конечно необходимо индексировать помещенного в черный список дюйм/с в целочисленной форме.

4
ответ дан eulerfx 2 October 2008 в 15:18
поделиться
  • 1
    It' s ~/.inputrc, если mysql был создан с GNU Readline. It' s ~/.editrc, если mysql был создан с BSD libedit. – JdeBP 10 February 2014 в 02:00

32-разрядные целые числа являются способом пойти - пока Вы не начинаете иметь дело с 128-разрядными адресами IPv6.

7
ответ дан Graeme Perrow 2 October 2008 в 15:18
поделиться

при получении IP-адреса, поскольку строка, сравнивая его со строкой может быть более эффективной, чем преобразование его к целочисленному представлению

, но я представил бы оба решения быть бесспорным, если несколько миллисекунд (наносекунды!) собираются иметь значение на этой операции;-)

1
ответ дан Steven A. Lowe 2 October 2008 в 15:18
поделиться

Я сделал это, и я протестировал его, использование неподписанного интервала (32 бита) является самым быстрым - я предполагаю, что Вы сравниваете это со строковым представлением.

Другая вещь, которая могла бы помочь Вам, при составлении таблицы в прошлом, у меня было 2 colums: LowIP и HighIP; тем путем я был в состоянии поместить в черный список все диапазоны IP с 1 рекордной записью и все еще получить хорошую производительность путем проверки на IP в диапазоне.

3
ответ дан Guy 2 October 2008 в 15:18
поделиться

Я когда-то наследовал код, где кто-то мысль , что хранение IP-адресов как 4 интервала было действительно хорошей вещью, кроме, они провели все свое время, преобразовывая в интервал

Хранение их, поскольку строки в базе данных были намного легче, и это только потребовало единственного индекса. Вы были бы удивлены, как хорошо SQL-сервер может индексировать строки в противоположность 4 столбцам целых чисел. Но этот список IP не был для помещения в черный список. Распространение в прямом и обратном направлениях базы данных является довольно дорогостоящим.

, Если база данных является излишеством, сохраните их в словаре в памяти, но это - просто предположение, так как мы понятия не имеем, сколько необходимо сравнить. Так как большинство хэш-кодов является 32-разрядным интервалом, и адреса IPv4 составляют 32 бита, сам IP-адрес мог бы просто быть хорошим хэш-кодом.

, Но поскольку другие указывают, наилучший вариант мог бы состоять в том, чтобы уменьшить нагрузку на Ваш сервер и купить специализированные аппаратные средства. Возможно, Вы сохраняете недавно помещенный в черный список IP в памяти и периодически публикуете новый к маршрутизатору.

, Если Вы - тот, пытающийся сделать некоторое программное обеспечение в маршрутизаторе, тогда необходимо будет извлечь книгу структур данных и создать что-то как B-дерево.

3
ответ дан Robert Paulson 2 October 2008 в 15:18
поделиться

Целочисленные сравнения намного быстрее, чем сравнения строк.

при хранении целых чисел в отсортированном списке можно найти их быстрее, чем в неотсортированном списке.

2
ответ дан Adam Pierce 2 October 2008 в 15:18
поделиться
  • 1
    accepts_nested_attributes_for может быть по обе стороны от отношений (по крайней мере, I' ve подтвержден для has_one, belongs_to). Я предполагаю, что has_many функционирует то же. – agmin 19 January 2013 в 00:22

Radix или PATRICIA Trie является оптимальной структурой для этого.

Проверьте источник C для потоковых инструментов: http://www.splintered.net/sw/flow-tools/

Я работал над этим несколько лет назад.

3
ответ дан 1 December 2019 в 17:17
поделиться
static public bool IsEqual(string ToCompare,
                                      string CompareAgainst)
  {

     return IPAddressToLongBackwards(ToCompare)==IPAddressToLongBackwards(CompareAgainst);
  }

static private uint IPAddressToLongBackwards(string IPAddr)
  {
     System.Net.IPAddress oIP=System.Net.IPAddress.Parse(IPAddr);
     byte[] byteIP=oIP.GetAddressBytes();


     uint ip=(uint)byteIP[0]<<24;
     ip+=(uint)byteIP[1]<<16;
     ip+=(uint)byteIP[2]<<8;
     ip+=(uint)byteIP[3];

     return ip;
  }

Если я вас правильно понял, это код для сравнения двух IP-адресов. Вы хотите, чтобы это? Вы также можете делать такие вещи, как:

static public bool IsGreater(string ToCompare,
                               string CompareAgainst)
  {

     return IPAddressToLongBackwards(ToCompare)>
        IPAddressToLongBackwards(CompareAgainst);
  }

, потому что у вас есть байты адреса.

6
ответ дан 1 December 2019 в 17:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: