32 bit per un indice? Quanto è grande il tuo tavolo ?!
Considerare che la maggior parte degli indirizzi IPv6 si baseranno su un indirizzo hardware. Date un'occhiata a 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|
+----------------+----------------+----------------+
Stando così le cose, provare questo hack rapido e sporco che avrebbe funzionato nella maggior parte dei casi (ipotizzando una distribuzione uniforme delle porte e gli indirizzi MAC):
- Prendere la 16 bit inferiori dell'indirizzo IPv6 di origine. Spostalo di 16 bit a sinistra e OPPURE con i 16 byte inferiori dell'indirizzo IP di destinazione
- Porta la sorgente. Spostare verso sinistra di 16 bit e OR con la porta di destinazione
- XOR il risultato dei due valori superiori a 32 bit insieme
Se l'utente utilizza indirizzi assegnati manualmente, questa funzione hash vinto' essere distribuiti in modo molto uniforme, ma penso che nella maggior parte dei casi sarà vicino. Se vuoi, puoi inserire (XOR) alcuni bit dalla parte superiore dell'indirizzo.
è ad alte prestazioni un requisito? – Alnitak
Perché non utilizzare MD5 o SHA-1 e tagliare i bit non necessari? Sebbene, devo dire, ciò sprecherebbe molte informazioni. O hai altri requisiti come la velocità o il consumo di memoria? – RedX
@RedX - vedere ^^ _è ad alte prestazioni un requisito_ :) – Alnitak