Нужна хеш-функция для создания 32-битного значения из 16-байтового адреса ipv6 и 2-байтового номера порта TCP - PullRequest
7 голосов
/ 30 июня 2011

Я хочу создать хеш-значение 32 бит.У меня есть 16-байтовые адреса источника и назначения ipv6 и 2-байтовые номера портов источника и назначения.

32-битный выход = (Src IP, Dst Ip, Src Port, Dest Port)

Было былучше, если хеш-функция хорошо распределяет объекты по 32-битному пространству.Я хочу использовать результат в качестве индекса.

Resit

Ответы [ 4 ]

5 голосов
/ 30 июня 2011

Еще, могут пригодиться ссылки:

Алгоритмы хэш-функции общего назначения

CityHash от Google

Обратите внимание, что очень трудно создать хеш-функцию без гарантии столкновения (нет другого входного результата в том же хеш-коде). Существует много способов решения этой проблемы, наиболее простым из которых является открытая адресация.

Открытая адресация

3 голосов
/ 07 июля 2011

32 бита для индекса? Насколько велик твой стол?!

Учтите, что большинство адресов IPv6 будут основаны на аппаратном адресе. Взгляните на RFC 4291 :

[EUI64] defines a method to create an IEEE EUI-64 identifier from an
IEEE 48-bit MAC identifier.  This is to insert two octets, with
hexadecimal values of 0xFF and 0xFE (see the Note at the end of
appendix), in the middle of the 48-bit MAC (between the company_id
and vendor-supplied id).  An example is the 48-bit IEEE MAC with
Global scope: 

|0              1|1              3|3              4|
|0              5|6              1|2              7|
+----------------+----------------+----------------+
|cccccc0gcccccccc|ccccccccmmmmmmmm|mmmmmmmmmmmmmmmm|
+----------------+----------------+----------------+

В таком случае попробуйте этот быстрый и грязный хак, который будет работать в большинстве случаев (при условии равномерного распределения портов и MAC-адресов):

  • Возьмите младшие 16 бит исходного IPv6-адреса. Сдвиньте его на 16 бит влево и ИЛИ с младшими 16 байтами IP-адреса назначения
  • Возьмите порт источника. Сдвиньте его влево на 16 бит и ИЛИ с помощью порта назначения
  • XOR результат двух вышеуказанных 32-битных значений вместе

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

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

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

1 голос
/ 30 июня 2011

См. Eternally Confuzzled для получения некоторой общей информации о хэш-функциях и нескольких известных алгоритмах; Я бы, наверное, пошел с FNV или по одному хэшу Дженкинса.

...