Хеширование IP-адреса на номер в [0, H) - PullRequest
3 голосов
/ 20 июля 2011

Я использую Python-2.6.У меня очень мало знаний о хэш-функциях.

Я хочу использовать хэш-функцию CRC для хеширования IP-адреса, такого как '128.0.0.5', в диапазон [0, H).В настоящее время я думаю заняться

zlib.crc32('128.0.0.5')%H.

Это нормально?Есть несколько вопросов.Вы могли бы попытаться ответить ...

  • это делает какой-либо различий.если я хеширую '128.0.0.5' или его двоичное '0001110101010 ..', что бы это ни было или без '.'s

  • zlib.crc32 возвращает целое число со знаком.Делает моддинг (%) нег.с положительным H всегда дает положительное нет?

  • Влияет ли% -ингуляция на H, насколько хороша хэш-функция?(Я имею в виду, что лучшее, что я мог сделать для доступного пространства, с доступным xlib.crc32)

Спасибо!

Ответы [ 3 ]

4 голосов
/ 20 июля 2011

Почему вы хотите хешировать IP-адрес в число? У них уже есть целочисленное представление. Например, используя netaddr :

>>> import netaddr
>>> ip = netaddr.IPAddress('192.168.1.1')
>>> ip.value
3232235777
>>> netaddr.IPAddress(3232235777)
IPAddress('192.168.1.1')
1 голос
/ 20 июля 2011

делает ли это разницу.если я хэширую '128.0.0.5' или его двоичный файл '0001110101010 ..' независимо от того, что есть или без '.'s

Не совсем.

zlib.crc32возвращает целое число со знакомДелает моддинг (%) нег.с положительным H всегда дает положительное нет?

Да.

Влияет ли% -ингуляция H на насколько хороша хэш-функция?(Я имею в виду, что лучшее, что я мог бы сделать для доступного пространства, с доступным xlib.crc32)

Вам лучше использовать все биты контрольной суммы, чтобы восполнить их отсутствие"лавинный эффект".Вариации с одной цифрой, такие как 192.168.1.1, 192.168.1.2 и т. Д., Могут привести к различиям только в первых битах контрольной суммы, а поскольку % заботится только о последних битах, хэши будут сталкиваться.

1 голос
/ 20 июля 2011

объявление 1) Это даст другие результаты, но не повлияет на качество хеша.

объявление 2) Это всегда будет давать положительное число или ноль.Ограничение количества возможных сегментов влияет на качество хэша.

В общем: Каков размер вашего H?Помните, что адрес IPv4 - это не более чем 32-битное значение.192.168.0.1 - это просто более понятное для человека побайтное представление.Поэтому, если ваш H больше 4294967295, хэшировать не нужно.

...