Зачем нужно кодировать IP-адрес?

SlavikSG

Новичок
Зачем нужно кодировать IP-адрес?

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

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

Gas

может по одной?
об чём речь? о переводе в integer ?

ага, нашёл. если тебе не нужно кодировать - не кодируй, да и толк от такого кодирования не совсем ясен, когда в сети куча функций для раскодирования.
 

Wicked

Новичок
строка у них случаем не из 8 hex-символов?

не знаю, как сделано в пхпбб, но из общих соображений про [m]ip2long[/m] и [m]long2ip[/m] можно сказать следующее:
1) числа можно сравнивать на больше-меньше. IP-строки тоже можно, но гораздо сложнее.
2) числа занимают меньше места.

Там есть две самодельные функции, одна из которых IP-адрес?
?я чото п :)
 

whirlwind

TDD infected, paranoid
>про ip2long и long2ip можно сказать следующее:

Можно использовать для поиска по маске
 

SlavikSG

Новичок
Ооо!! Еее!! Я баран!!
И точно! Именно операции сравнения на больше, меньше. И точно!
Спасибо большое за ответ! :)

А что касается моих таблиц, то в наш век гигабайтов и грядущих терабайтов, можно хранить айпишник и в двух полях. В обычном виде и в Hex. И ничего страшного при этом не произойдет. Так и сделаю. :)

Сами функции из форума phpBB вот:

Function Encode_Ip_Adres($dotquad_ip)
{
$ip_sep = explode('.', $dotquad_ip);
return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]);
}

Function Decode_Ip_Adres($int_ip)
{
$hexipbang = explode('.', chunk_split($int_ip, 2, '.'));
return hexdec($hexipbang[0]). '.' . hexdec($hexipbang[1]) . '.' . hexdec($hexipbang[2]) . '.' . hexdec($hexipbang[3]);
}
 

kruglov

Новичок
SlavikSG
Вы лучше подумайте не про грядущие терабайты, а про грядущие IPv6
 

Фанат

oncle terrible
Команда форума
не понял, нахрена хранить в каком-то уродливом хексе
 

podust

Новичок
Автор оригинала: SlavikSG
А что касается моих таблиц, то в наш век гигабайтов и грядущих терабайтов, можно хранить айпишник и в двух полях. В обычном виде и в Hex. И ничего страшного при этом не произойдет.
Ну не скажите :) При 100 миллионах записей в таблице (есть и такие) экономия при хранении IP в Integer может достигать 1 гигабайта.
И честно говоря не совсем понятно, зачем хранить IP в Hex'е :)
 

berkut

Новичок
при 100 млн записей, дополнительный гиг места на диске тебя будет волновать меньше всего
 

podust

Новичок
Автор оригинала: berkut
при 100 млн записей, дополнительный гиг места на диске тебя будет волновать меньше всего
Ну все-таки по-моему лучше оптимизировать, если есть такая возможность :)
Да и как тут справедливо заметили - стоит подумать о грядущем IPv6.
 

Gas

может по одной?
podust
ну и скажи какая оптимизация будет при храненении ip в 16-ой системе в поле char в отличие о 10-ой в поле int?
 

podust

Новичок
Автор оригинала: Gas
podust
ну и скажи какая оптимизация будет при храненении ip в 16-ой системе в поле char в отличие о 10-ой в поле int?
Если не ошибаюсь - будет. MySQL быстрее работает с integer'ами, чем с varchar'ами, насколько я знаю.
Да и сами подумайте - разработчики MySQL ведь не просто так создали функции NTOA/ATON? :)

Кстати, http://habrahabr.ru/blog/mysql/35837.html - очень полезная статья - там же и про INET_NTOA.
 

fixxxer

К.О.
Партнер клуба
ну вообще то 32битное целое это и есть ip адрес ;)
4 циферки с точками это просто "человекопонятное" представление
 

podust

Новичок
Автор оригинала: fixxxer
4 циферки с точками это просто "человекопонятное" представление
Ну я про то и говорю - зачем же хранить в БД "человекопонятное" представление, когда его можно переводить туда и обратно по мере надобности (причем без потери скорости)? :)
 

Gas

может по одной?
podust
вообще-то, именно это я и имел ввиду. Смысла зачем так делают в phpBB я тоже не вижу.
 

SlavikSG

Новичок
Пора бы уже разработчикам баз данных подумать про новый тип данных. Специально заточенный для IP-адреса. Пусть бы смотрелось там все в обычном и привычном виде, но чтобы работало так же быстро, как и с целыми числами.
А почему бы и нет?! :)
 
Сверху