WedX - журнал о программировании и компьютерных науках

Преобразуйте диапазон IP-адресов в два BIGINT для более быстрого поиска.

Я работаю над проектом, в котором нам нужно сделать IP Address lookups. Итак, для этого у нас есть наборы данных, которые будут выглядеть так, как показано ниже, и теперь следующие шаги — заполнить эти наборы данных (может быть файл csv) в файле MySql table. Ниже приведен пример набора данных, содержащий столбцы:

ip_address      country region  city           metro-code   latitude    longitude   postal-code   country-code   region-code    city-code   continent-code  country-code

24.32.116.116   usa       tx    clarksville    623           33.6103    -95.0498    75426            840           44             34918            6            us
65.29.108.232   usa       mi    novi           505           42.4637    -83.4604    48375            840           23             4339             6            us
66.169.99.69    usa       tx    ft worth       623           32.7016    -97.3823    76109            840           44             771              6            us
72.70.100.111   usa       ma    peabody        506           42.5332    -70.9726    1960             840           22             1392             6            us
174.252.116.137 usa       va    oakton         511           38.8892    -77.3222    22124            840           47             3860             6            us
68.55.144.242   usa       md    pasadena       512           39.1276    -76.5125    21122            840           21             4358             6            us
174.252.83.27   usa       pa    lancaster      566           40.0459    -76.3542    17603            840           39             333              6            us
174.78.192.31   usa       ga    warner robins  503           32.5958    -83.6384    31088            840           11             5052             6            us
98.192.146.235  usa       fl    panama city    656           30.1804    -85.5598    32404            840           10             671              6            us
71.192.181.20   usa       ma    springfield    543           42.1187    -72.5483    1109             840           22             967              6            us
76.183.54.227   usa       tx    dallas         623           32.7202    -96.6769    75217            840           44             77               6            us
69.62.143.140   usa       ca    granite bay    862           38.7442    -121.191    95746            840           5              49451            6            us
69.142.76.32    usa       nj    penns grove    504           39.707     -75.4467    8069             840           31             2335             6            us
70.173.54.93    usa       nv    las vegas      839           36.2059    -115.225    89108            840           29             173              6            us
98.242.8.222    usa       ca    fresno         866           36.7968    -119.883    93722            840           5              19               6            us

Постановка проблемы:-

Я планирую хранить START_IP_NUM и END_IP_NUM как BIGINT в базе данных MySql вместо хранения IP Address в таблице, поскольку поиск по BIGINT выполняется намного быстрее, чем поиск строки (нотация IP-адресов с точками). Так же, как у нас есть настройка базы данных для Maxmind.

Итак, мой вопрос: у нас будет отдельный Java Program, который будет заполнять вышеуказанные наборы данных в таблице MySql. Поэтому мне нужно создать какую-то логику, которая может преобразовать приведенные выше наборы данных, как показано ниже:

start_ip_num
end_ip_num
country 
region  
city           
metro-code  
latitude    
longitude   
postal-code   
country-code     
region-code 
city-code   
continent-code  
country-code

Я запутался, учитывая IP-адрес, как мне установить здесь start_ip_num и end_ip_num и сохранить его в MySql table. Поскольку я предполагаю, что будет файл, который будет содержать наборы данных, подобные приведенным выше, а затем мне нужно прочитать этот файл и какую-то логику устройства, чтобы преобразовать IP-адрес в два BIGINT и сохранить его в таблице MySql.

И после сохранения в базе данных MySql. Я могу найти что-то подобное в MySql-

SELECT country
FROM geoip
WHERE
INET_ATON('174.36.207.186') BETWEEN start_ip_num AND end_ip_num
LIMIT 1

ОБНОВЛЕНИЕ:-

Предположим, у меня есть пара Thousands IP Address вроде 100,000 IP Addresses в текстовом файле с форматом, который я упомянул выше.

Теперь моя главная цель - сделать IP Address lookup. В соответствии с этим IP Address получите все остальные обязательные поля.

Итак, чтобы заставить эту штуку работать, я изначально планировал выгружать данные текстового файла в том виде, в котором они находятся в файле MySql table. Таким образом, таблица MySql будет содержать столбец IP Address и другие столбцы, как в приведенном выше примере. Но поиск в String стоит дорого.

Поэтому я подумал, что должен преобразовать эти IP-адреса в диапазон start_ip_num и end_ip_num, а затем вывести данные в MySql table, так что теперь это будет выглядеть примерно так:

start_ip_num
end_ip_num
country 
region  
city           
metro-code  
latitude    
longitude   
postal-code   
country-code     
region-code 
city-code   
continent-code  
country-code

И теперь, если мне нужно выполнить поиск, я могу встроить этот SQL query в свой WebService eventually-

SELECT country
FROM geoip
WHERE
INET_ATON('174.36.207.186') BETWEEN start_ip_num AND end_ip_num
LIMIT 1

Итак, вопрос заключается в том, учитывая Text file, который будет иметь список IP Addresses и других полей, соответствующих этому IP Address, как мне массировать его таким образом, чтобы я мог хранить те же наборы данных в MySql в формате, который я упомянутые выше, такие как start_ip_num и end_ip_num, country и другие поля.

В основном я пытаюсь следовать схеме базы данных, такой как Maxmind в настоящее время. У них также есть start_ip_num и end_ip_num и другие поля. И когда вам нужно выполнить поиск, вы можете выполнить поиск на основе SQL, о котором я упоминал выше, путем преобразования IP-адреса в BIGINT с использованием INET_ATON.


  • Почему бы не сохранить его как целое число? Адреса IPv4 гарантированно не превышают 8 байт. 12.03.2013
  • @Makoto Я бы сказал, что IPv4-адреса гарантированно состоят из 4 байтов. 12.03.2013
  • Я проголосовал за предложение с IPv4 и 4 байтами, но... может быть, хорошо иметь поддержку IPv6 в новом приложении? 12.03.2013
  • Да, мы также думаем о поддержке IPv6. Если мы решим использовать IPv6, нужно ли что-то менять в моей таблице? 12.03.2013
  • @TechGeeky Если вы также хотите поддерживать адрес IPv6, сделайте столбец 128-битным целочисленным столбцом. Затем, возможно, есть еще один столбец из 1 символа, который указывает, представляет ли целое число адреса адрес IPv4 или IPv6, чтобы вы могли соответствующим образом указать значение в нем. 12.03.2013
  • Понимаю. Я запомню это. Поддержка IPv6 нам понадобится в будущих случаях. На данный момент я в основном сосредоточен на том, как импортировать вышеуказанные наборы данных в базу данных MySql с помощью start_ip_num и end_ip_num. 12.03.2013
  • @nos, да, но как получить start_ip_num и end_ip_num. Я могу получить только один BIGINT для IP-адреса, но как получить диапазоны start_ip_num и end_ip_num? Это сбивает меня с толку. 12.03.2013
  • @techgeeky в файле, который у вас есть выше, перечислены все отдельные IP-адреса, и вы хотите объединить идентичные строки в одну строку в базе данных? Например, файл содержит 123.5.7.2 Хьюстон и 123.5.7.3 Хьюстон в виде двух строк, но вам нужна одна строка в базе данных? Я не совсем понимаю ваш вопрос, учитывая ваш комментарий к моему ответу. 12.03.2013
  • @nos, я только что обновил свой вопрос, добавив больше деталей. Дайте мне знать, если все еще не ясно. Я постарался предоставить все подробности. 12.03.2013
  • @rlb, я только что обновил свой вопрос, добавив более подробную информацию. Дайте мне знать, если все еще не ясно. Я постарался предоставить все подробности. 13.03.2013

Ответы:


1

Адреса IPv4 содержат 4 числа, каждое из которых может находиться в диапазоне от 0 до 255.

Вы можете преобразовать адрес A.B.C.D в 32-битное целое число (или bigint, если хотите) с помощью этой логики.

Result = (A<<24) | (B<<16) | (C<<8) | D

Где A,B,C,D — целые числа. Это метод, который мы используем, и я думаю, что он даже изначально был протестирован против MaxMind. (извините, если не совсем пример Java)

12.03.2013
  • Спасибо, но как получить start_ip_num и end_ip_num. Я могу получить только один BIGINT для IP-адреса из приведенного выше примера, верно? Но как получить диапазоны start_ip_num и end_ip_num? Это сбивает меня с толку. 12.03.2013

  • 2

    Кажется, вы устанавливаете какие-то жесткие отношения между IP-адресом и его физическим местоположением в мире. Например, если два тесно связанных IP-адреса находятся в Нью-Йорке, то любой IP-адрес со значением между этими двумя IP-адресами также должен быть из Нью-Йорка; правильно?

    Неправильно!

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

    Установление связи между IP-адресом и его физическим местоположением требует очень обширной базы данных и даже в этом случае очень подвержено ошибкам и ежедневным изменениям. Даже база данных, используемая Google, вероятно, заполнена ошибками; несмотря на его обширные данные.

    12.03.2013

    3

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

    1) Преобразовать все IP-адреса в IP-номера 2) Отсортировать IP-номера по возрастанию 3) Просканировать записи и сжать запись с тем же городом

    Например, IP 1 и IP 2 находятся в городе X. Вы можете представить их как 1,2,X.

    Предполагается, что у вас есть почти весь IP-адрес. Если между двумя номерами отсутствует пробел, вам нужно предположить, что они из одного и того же города X. Например, IP 1 и IP 3 находятся в городе X, вы также предполагаете, что IP 2 находится в X. 1,3,Х.

    13.03.2013
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]