2011-06-30 8 views
7

Desidero creare un valore hash di 32 bit. Dispongo di 16 indirizzi IPv6 di destinazione e destinazione e 2 porte e numeri di porta di destinazione.È necessaria una funzione hash per creare un valore a 32 bit da ipv6 Indirizzo byte 16 e numeri di porta TCP 2

32 bit di uscita = (Src IP, Dst Ip, Src Port, Dest Port)

Sarebbe meglio se la funzione di hash distribuire le entità ben lungo lo spazio a 32 bit. Voglio usare il risultato come indice.

Resit

+0

è ad alte prestazioni un requisito? – Alnitak

+0

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

+0

@RedX - vedere ^^ _è ad alte prestazioni un requisito_ :) – Alnitak

risposta

1

Vedi Eternally Confuzzled per alcune informazioni generali sulle funzioni di hash e diversi algoritmi ben noti; Probabilmente andrei con l'hash One-at-time di FNV o Jenkins.

5

altro, possono essere riferimenti utili:

General Purpose Hash Function Algorithms

CityHash by Google

Si noti che, è molto difficile fare una collisione garantito funzione di hash (non è diverso il risultato dell'inserimento nello stesso codice hash). Esistono molte soluzioni a questo problema, la più semplice è l'indirizzamento aperto.

Open Addressing

+3

Grazie, gli algoritmi della funzione Hash General Purpose sembrano essere la strada da percorrere. Sperimenterò con i loro algoritmi. –

3

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.

+0

Beh, questo è stato molto utile. Non ho considerato la procedura di creazione degli indirizzi IPv6. Non uso indice a 32 bit. Il nostro algoritmo è molto semplice, calcola un valore a 32 bit, quindi prendiamo il modulo dell'output per dimensione del nostro buffer. Non so quanto sia efficace, ma funziona. Il problema è che voglio usare la stessa tabella hash per gli indici di input a 128 e 32 bit. –

1

murmurhash è molto veloce e abbastanza rispettato, per quanto posso dire. Non è forza crittografica, ma dovrebbe essere adeguata ai tuoi scopi.

Problemi correlati