Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-11-2007, 21: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, 10: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 10:19.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2007, 10: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, 10: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, 11: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


DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
Dashcam 70mai 4K da 69,99€, minimo stori...
I 5 robot per le pulizie più scon...
Apple annuncia i nuovi MacBook Pro con s...
Warhorse Studios colpita da un grave att...
MX Master 4, arriva l'edizione speciale ...
Kali Linux 2026.3 porta la caccia alle r...
Oracle si affida a OpenAI: ChatGPT e Cod...
Kaspersky punta su IA e servizi gestiti ...
Già sfruttata la falla Brotli che...
Potrebbe essere stato scoperto un nuovo ...
Claude Code, il prompt per scovare telec...
Palit e GALAX smentiscono le voci sulla ...
Fujifilm annuncia la Instax Mini Evo 2, ...
Tailscale chiude le falle SSH verso root...
Il tuo Galaxy laggava nei giochi? Samsun...
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: 07:24.


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