32 bity wskaźnika? Jak duży jest twój stół ?!
Należy wziąć pod uwagę, że większość adresów IPv6 będzie oparta na adresie sprzętowym. Spójrz na 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|
+----------------+----------------+----------------+
Skoro tak, spróbuj to szybki i zabrudzony hack, który będzie działać w większości przypadków (zakładając równomierny rozkład portów i adresów MAC):
- podejmują niższe 16 bitów źródłowego adresu IPv6. Przesuń 16 bitów w lewo i LUB dolne 16 bajtów docelowego adresu IP
- Weź port źródłowy. Przesunąć go w lewo o 16 bitów i OR go z portem docelowym
- XOR wynikiem wartościami dwa powyżej 32-bitowych razem
Jeśli użytkownik korzysta z ręcznie przypisane adresy, ta funkcja hash wygrał” t być bardzo równomiernie rozmieszczone, ale myślę, że w większości przypadków będzie blisko. Możesz wrzucić (XOR) kilka bitów z górnej części adresu, jeśli chcesz.
jest wymaganiem wysokiej wydajności? – Alnitak
Dlaczego nie używać MD5 lub SHA-1 i odciąć niepotrzebne bity? Chociaż muszę powiedzieć, że zmarnowałoby to wiele informacji. Czy masz jakieś inne wymagania, takie jak szybkość lub zużycie pamięci? – RedX
@RedX - patrz ^^ _jest wysoka wydajność wymaganie_ :) – Alnitak