|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
[C] Hash Table: roba che si mangia?
Ciao,
dato un URL in ingresso ad un programma devo confrontarlo per una corrispondenza in una luuuunga lista di URL. da quello che ho capito la funzionalità che mi serve è implementata da qualcosa chiamato Hash Table. http://en.wikipedia.org/wiki/Hash_table Mi date qualche riferimento per documentarmi meglio, magari con del codice di esempio? tenete presente che io so programmare solo in C (eccetto per i linguaggi di scripting) e che comunque il resto del codice l'ho già scritto in C. cosa ne pensate di queste implementazioni? http://www.ipd.bth.se/ska/sim_home/libghthash.html http://cmph.sourceforge.net/ http://uthash.sourceforge.net/userguide.html grazie
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per corrispondenza intendi uguaglianza ?
IMHO fai prima a calcolarti un hash di ogni url ed a salvarti questo hash insieme all'url. Dopo quello che ti serve è solo un'indicizzazione degli hash. Per calcolare l'hash puoi usare md5. Un md5 è qualcosa di questo tipo: 5308a79f5e652edba5be84644ee14b09 Ad esempio: con un indice a due livelli. Immagina di avere una lista di strutture: Codice:
struct url_list { char *url; struct url_list *next; }; typedef struct url_list * url_list_pointer; url_list_pointer hash_table[256][256]; /* da inzializzare a NULL */ Quindi: Codice:
int get_hex_value_from_char(char c) { return (c < '9' && c > '0') ? c - '0' : (c < 'f' && c > 'a') ? c - 'a' + 10 : 0; } int row_index = get_hex_value_from_char(md5_string[0]) * 16 + get_hex_value_from_char(md5_string[1]); int column_index = get_hex_value_from_char(md5_string[2]) * 16 + get_hex_value_from_char(md5_string[3]); Grazie al md5 gli url si andranno a distribuire uniformemente su tutta la tabella. Ovviamente dovrai pensare anche a come inserire un url nella lista ![]() Una volta che accedi ad una lista della tabella, se l'elemento contiene NULL allora non ci sono match, se contiene una lista valida allora devi fare un confronto fra le stringhe in tutta la lista, ma grazie alla distribuzione quasi uniforme il numero di confronti sarà mediamente di NUMERO_DI_URL / 2^16. Se hai un numero di url molto maggiore di 2^16...che so...molto maggiore di 2^24 allora ti conviene ampliare la tabella, ad esempio andando a lavorare su 2^12 bit per indice (3 cifre esadecimali per indice). In questo modo arrivi tranquillamente a gestire 2^32 url facendo un numero di confronti fra stringhe massimo pari a 2^8 ![]() In alternativa c'è anche la possibilità di aumentare il numero di livelli dell'indicizzazione ![]() Ultima modifica di cionci : 22-11-2007 alle 09:19. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
Inizialmente avevo pensato di usare MD5 oppure SHA1, calcolare un hash della URL e metterlo in un DB tipo sqlite. Il programma una volta online deve solo leggere dal DB non scrivere. il punto è che avrò circa 10^6 URL da controllare in tempo reale per emettere un verdetto "si puoi navigare" / "no no puoi navigare". Poi però leggendo qua:
Quote:
Quanto è veloce la macchina a calcolare un hash MD5? tenete presente che devo fare tutto su un AMD Geode LX800 @ 500 MHz con 256 MB di RAM. il fatto di immagazzinare tutto in un DB mi era comodo perchè devo aggiornare la lista di URL frequentemente sulla base di dati che mi vengono inviati.
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
potrei anche fare un mix: caricare tutto in un DB e all'avvio del programma precaricare una tabella di hash come quella che mi ha illustrato cionci ....
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Sicuramente un hash come md5 per un problema di questo tipo è sovradimensionato, ma in fondo a runtime si tratta di calcolarlo solo una volta per ogni url di cui verifichi la presenza. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:53.