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) некоторые биты из верхней части адреса, если хотите.