Сжатие IP для хранения базы данных - PullRequest
2 голосов
/ 28 марта 2011

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

В результате я хранил все IP-адреса анонимных пользователей, которые проголосовали в моих опросах. Моя база данных заполнена IP-адресами, такими как 123.456.789 ...

Однако, это неэффективно, есть ли односторонняя функция, которая сжимает и IP в более короткую строку?

как 123.456.798 =>% dA

Ответы [ 4 ]

2 голосов
/ 28 марта 2011

Если вы храните их как строки в своей базе данных, да, это будет расточительно.Вы можете преобразовать их в 4-байтовые целые числа перед сохранением.

Класс java.net.InetAddress имеет метод getByName, который возвращает новый объект InetAddress.Вызов getAddress для возвращаемого объекта возвращает вам байтовый массив адресов, который вы можете легко превратить в int.

Обратите внимание, что InetAddress также будет работать с адресами IPv6, поэтому вам нужно убедитьсявы можете сохранить их в своей БД или проверить тип InetAddress, возвращаемый из вызова getByName, чтобы убедиться, что это IPv4-адрес.

2 голосов
/ 28 марта 2011

Для IPv4 вы можете сжать IP-адрес в int следующим образом:

Scanner scanner = new Scanner(ip).useDelimiter("\\.");
int value = (scanner.nextInt() << 24) | (scanner.nextInt() << 16)
        | (scanner.nextInt() << 8) | scanner.nextInt();

Это также можно изменить:

String ip = ((value >> 24) & 0xFF) + "." + ((value >> 16) & 0xFF)
        + "." + ((value >> 8) & 0xFF) + "." + (value & 0xFF);
1 голос
/ 28 марта 2011

IPv4-адрес - 32 бита.В точечной нотации у вас есть строка длиной до 15 байтов, которая все еще представляет 32-битный (4-байтовый) адрес.Очевидным шагом было бы преобразовать их в двоичный формат, такой как inet_aton или inet_pton.Последний обычно рекомендуется для нового кода, так как он обрабатывает адреса IPv6 в дополнение к IPv4.

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

0 голосов
/ 28 марта 2011

Если вы не поддерживаете IPv6, ip-адрес подходит для int. Вам действительно нужно что-то меньшее?

А если вы поддерживаете IPv6, подойдут два long. Все еще кажется довольно маленьким.

...