33 è stato scelto perché:
1) Come detto prima, la moltiplicazione è facile da calcolare utilizzando shift e aggiungere.
2) Come si può vedere dallo spostamento e aggiungere l'implementazione, l'utilizzo di 33 crea due copie della maggior parte dei bit di input nell'accumulatore di hash, quindi distribuisce quei bit relativamente distanti tra loro. Questo aiuta a produrre una buona valanga. L'uso di uno spostamento più ampio duplicherebbe meno bit, utilizzando uno spostamento più piccolo si manterrebbero le interazioni tra i bit più locali e ci sarebbe voluto più tempo prima che le interazioni si diffondessero.
3) Lo spostamento di 5 è relativamente primo a 32 (il numero di bit nel registro), che aiuta con la valanga. Mentre nella stringa ci sono abbastanza caratteri, ogni bit di un byte di input alla fine interagirà con ogni bit precedente di input.
4) Lo spostamento di 5 è una buona quantità di spostamento quando si considerano i dati dei caratteri ASCII. Un carattere ASCII può essere pensato come un selettore di tipo di carattere a 4 bit e un selettore di tipo di carattere a 4 bit. Per esempio. le cifre hanno tutte 0x3 nei primi 4 bit. Quindi uno spostamento a 8 bit causerebbe bit con un determinato significato per interagire principalmente con altri bit che hanno lo stesso significato. Uno spostamento a 4 o 2 bit produrrebbe allo stesso modo forti interazioni tra bit simili. Lo spostamento a 5 bit fa sì che molti dei quattro bit di ordine basso di un personaggio interagiscano fortemente con molti dei 4 bit superiori nello stesso carattere.
Come affermato altrove, la scelta di 5381 non è troppo importante e molte altre scelte dovrebbero funzionare anche qui.
Questa non è una funzione di hash veloce poiché elabora l'immissione di un carattere alla volta e non tenta di utilizzare il parallelismo a livello di istruzione. È, tuttavia, facile da scrivere. La qualità dell'output diviso per la facilità di scrittura del codice è probabile che colpisca un punto debole.
Sui processori moderni, la moltiplicazione è molto più veloce di quando è stato sviluppato questo algoritmo e altri fattori di moltiplicazione (ad esempio 2^13 + 2^5 + 1) possono avere prestazioni simili, risultati leggermente migliori ed essere leggermente più facili da Scrivi.
Contrariamente a una risposta sopra, una buona funzione di hash non crittografica non vuole produrre un output casuale. Invece, dati due input che sono quasi identici, vuole produrre output molto diversi. Se i valori di input sono distribuiti casualmente, non hai bisogno di una buona funzione di hash, puoi semplicemente utilizzare un insieme arbitrario di bit dal tuo input. Alcune delle funzioni di hash moderne (Jenkins 3, Murmur, probabilmente CityHash) producono una migliore distribuzione degli output rispetto agli input casuali che sono molto simili.
Si noti che il valore iniziale dell'hash (5381) non fa differenza per stringhe di uguale lunghezza, ma avrà un ruolo nella generazione di valori hash diversi per stringhe di lunghezze diverse. – yoyo