Ho una lunga lista di parole inglesi e vorrei scriverle. Quale sarebbe una buona funzione di hashing? Finora la mia funzione di hashing somma i valori ASCII delle lettere e quindi modulo le dimensioni della tabella. Sto cercando qualcosa di efficiente e semplice.Qual è una buona funzione di hash per le parole inglesi?
risposta
Sommare semplicemente le lettere non è una buona strategia perché una permutazione dà lo stesso risultato.
Questo (djb2) è piuttosto popolare e funziona perfettamente con le stringhe ASCII.
unsigned long hashstring(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
Se avete bisogno di più alternative e alcune misure di perfomance, leggere here.
Aggiunto: Queste sono generali funzioni di hashing, in cui il dominio di ingresso non è nota in anticipo (tranne forse alcune ipotesi molto generali: ad esempio, le opere di cui sopra leggermente meglio con ingresso ASCII), che è lo scenario più usuale . Se hai un dominio limitato noto (set di input fissi) puoi fare di meglio, vedi la risposta di Fionn.
Forse qualcosa di simile potrebbe aiutare a: http://www.gnu.org/s/gperf/
Si genera una funzione di hashing ottimizzato per il dominio di ingresso.
Se non è necessario essere crittograficamente sicuro, suggerirei il Murmur Hash. È estremamente veloce e ha un'elevata diffusione. Facile da usare.
http://en.wikipedia.org/wiki/MurmurHash
http://code.google.com/p/smhasher/wiki/MurmurHash3
Se si ha bisogno di un hash crittograficamente sicuro, allora vi consiglio SHA1 via OpenSSL.
+1 per MurmurHash, fare sai se un confronto tra CityHash e MurmurHash? Ho sentito cose positive su entrambi, ma non ho mai visto un confronto completo, ho solo avuto alcuni fatti aneddotici. –
un po 'tardi, ma qui è una funzione di hashing con un tasso di collisione estremamente basso per la versione a 64 bit di seguito, e ~ quasi ~ come un bene per la versione a 32 bit:
uint64_t slash_hash(const char *s)
//uint32_t slash_hash(const char *s)
{
union { uint64_t h; uint8_t u[8]; };
int i=0; h=strlen(s);
while (*s) { u[i%8] += *s + i + (*s >> ((h/(i+1)) % 5)); s++; i++; }
return h; //64-bit
//return (h+(h>>32)); //32-bit
}
I numeri di hash sono anche distribuiti in modo molto uniforme nell'intervallo possibile, senza alcun grumo che potrei rilevare - questo è stato controllato usando solo le stringhe casuali.
[modifica]
Testato anche con parole estratte da file di testo locali combinati con le parole dizionario/thesaurus di LibreOffice (inglese e francese - oltre 97000 parole e costrutti) con 0 collisioni in 64-bit e 1 collisione in 32-bit:)
(anche confrontato con FNV1A_Hash_Yorikke, djb2 e MurmurHash2 on stessi set: Yorikke & djb2 non ha fatto bene; slash_hash ha fatto un po 'meglio rispetto MurmurHash2 in tutte le prove)
Questa è una funzione hash ragionevole. Suggerisco di evitare l'unione senza nome. - >> 'union {uint64_t h; uint8_t u [8]; } uu; 'e cambiamenti simili nel codice - >>' uu.h = strlen (s); '...' uu.u [i% 8] + = ... 'etc – joop
- 1. Che cos'è una buona funzione hash?
- 2. Conteggio di parole inglesi in una stringa casuale
- 3. Ha una buona funzione di hash per una tabella hash C++?
- 4. Database MySQL di parole inglesi?
- 5. Funzione hash per una stringa
- 6. Qual è la migliore funzione di hash a 32 bit per le stringhe corte (nomi di tag)?
- 7. Numero alle guide di conversione di parole inglesi
- 8. È una buona idea hash una classe Python?
- 9. Qual è una buona analogia per capire IoC e DI?
- 10. javascript elenco di parole inglesi per un gioco
- 11. Creazione di una tabella hash/funzione hash
- 12. Qual è una buona metafora per l'iniezione delle dipendenze?
- 13. Qual è una buona implementazione degli eventi deboli per silverlight?
- 14. Qual è una buona impostazione per noCompressionUserAgents in Tomcat?
- 15. Partizionamento! come fa hadoop farlo? Usa una funzione hash? qual è la funzione predefinita?
- 16. Qual è una buona alternativa per le proprietà statiche memorizzate di tipi generici in swift?
- 17. Qual è una buona spiegazione su come leggere la funzione istogramma di TensorBoard?
- 18. Una funzione hash minima per C?
- 19. PHP Qual è il modo migliore per ottenere le prime 5 parole di una stringa?
- 20. Come posso verificare se la mia funzione di hash è buona in termini di carico massimo?
- 21. Come implementare una buona funzione __hash__ in python
- 22. C'è un corpora di parole inglesi in nltk?
- 23. La dichiarazione parallela di funzione è una buona idea?
- 24. Qual è una buona soluzione per consentire una facile personalizzazione di un prodotto per cliente?
- 25. Qual è una buona struttura dati per costruire classi di equivalenza sui nodi di un albero?
- 26. È una buona ragione per usare alloca?
- 27. dove posso trovare una buona lista di parole
- 28. Qual è una buona struttura dati per le date periodiche o ricorrenti?
- 29. Qual è una buona alternativa a SQL Server per le applicazioni ASP.NET?
- 30. Una buona fonte per le librerie Lisp?
Controllare qui http: //www.cse. yorku.ca/~oz/hash.html –
Possibile duplicato di [Good Hash Function for Strings] (https://stackoverflow.com/questions/2624192/good-hash-function-for-strings) e [What is a good Funzione hash a 64 bit in Java per testuale stringhe?] (https://stackoverflow.com/questions/1660501/what-is-a-good-64bit-hash-function-in-java-for-textual-strings) –