Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-11-2007, 20:15   #1
gurutech
Senior Member
 
L'Avatar di gurutech
 
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”
gurutech è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2007, 09:16   #2
cionci
Senior Member
 
L'Avatar di cionci
 
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 */
Per indicizzare la tabella usa i primi 2 byte della stringa md5 (sono in esadecimale).
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]);
hash_table[row_index][column_index] conterrà la lista di tutti gli url che hanno gli stessi primi due byte dell'hash !!!

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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2007, 09:31   #3
gurutech
Senior Member
 
L'Avatar di gurutech
 
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:
Originariamente inviato da http://en.wikipedia.org/wiki/Hash_table
[...]
Choosing a good hash function
[...]
Simplicity and speed are readily measured objectively (by number of lines of code and CPU benchmarks, for example), but strength is a more slippery concept. Obviously, a cryptographic hash function such as SHA-1 would satisfy the relatively lax strength requirements needed for hash tables, but their slowness and complexity makes them unappealing. However, using cryptographic hash functions can protect against collision attacks when the hash table modulus and its factors can be kept secret from the attacker,[citation needed] or alternatively, by applying a secret salt.
[...]
ho pensato che forse non era la cosa adatta.
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”
gurutech è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2007, 09:33   #4
gurutech
Senior Member
 
L'Avatar di gurutech
 
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”
gurutech è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2007, 10:00   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da gurutech Guarda i messaggi
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 ....
Certo...ovviamente gli hash degli url devono essere precalcolati (basta salvarsi i primi byte dell'hash o direttamente gli indici), non è il caso di andare a calcolarteli ogni volta. Per l'inserimento nella tabella direi che andarseli ad inserire a runtime nella lista corrispondente dovrebbe costare relativamente poco dal punto di vista computazionale (fai un inserimento in testa, più il calcolo degli indici della tabella).

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.
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:30.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v