33 został wybrany, ponieważ:
1) Jak wspomniano powyżej, mnożenie jest łatwo obliczyć stosując przesunięcie uzupełnienia.
2) Jak widać z przesunięcia i dodania implementacji, użycie 33 powoduje wykonanie dwóch kopii większości bitów wejściowych w mieszalniku mieszającym, a następnie rozdziela te bity stosunkowo daleko od siebie. Pomaga to uzyskać dobre avalanching. Zastosowanie większej zmiany spowodowałoby powielenie mniejszej liczby bitów, użycie mniejszej zmiany spowodowałoby, że interakcje bitów stałyby się bardziej lokalne i wydłużenie interakcji trwa dłużej.
3) Przesunięcie 5 jest względnie pierwsze do 32 (liczba bitów w rejestrze), co pomaga w lawinowaniu. Mimo że w łańcuchu znaków jest wystarczająco dużo znaków, każdy bit bajtu wejściowego będzie w końcu wchodził w interakcje z każdym poprzednim bitem wejściowym.
4) Przesunięcie o 5 jest dobrą wartością przesunięcia przy rozważaniu danych znakowych ASCII. Znak ASCII może być traktowany jako 4-bitowy selektor typu i 4-bitowy selektor typu znakowego. Na przykład. wszystkie cyfry mają 0x3 w pierwszych 4 bitach. Tak więc 8-bitowa zmiana spowodowałaby, że bity o pewnym znaczeniu w większości oddziaływałyby z innymi bitami, które mają to samo znaczenie. Przesunięcie 4-bitowe lub 2-bitowe w podobny sposób wytworzy silne interakcje między podobnie myślącymi bitami. 5-bitowe przesunięcie powoduje, że wiele z czterech bitów niskiego rzędu danej postaci silnie oddziałuje z wieloma 4-wyższymi bitami tej samej postaci.
Jak podano w innym miejscu, wybór 5381 nie jest zbyt ważny i wiele innych opcji również powinno tu działać.
Nie jest to szybka funkcja mieszająca, ponieważ przetwarza ją wprowadzając znak na raz i nie próbuje używać paralelizmu na poziomie instrukcji. Łatwo jest jednak pisać. Jakość wyniku podzielona przez łatwość pisania kodu prawdopodobnie trafi w słodkie miejsce.
Na współczesnych procesorach mnożenie jest znacznie szybsze niż w chwili opracowania tego algorytmu, a inne czynniki mnożenia (np. 2^13 + 2^5 + 1) mogą mieć podobną wydajność, nieco lepszą wydajność i być nieco łatwiejsze pisać.
W przeciwieństwie do powyższej odpowiedzi, dobra funkcja kryptograficzna nie kryptograficzna nie chce generować losowego wyniku. Zamiast tego, biorąc pod uwagę dwa wejścia, które są prawie identyczne, chce produkować bardzo różne wyjścia. Jeśli twoje wartości wejściowe są losowo rozdzielone, nie potrzebujesz dobrej funkcji skrótu, możesz po prostu użyć dowolnego zestawu bitów ze swojego wejścia. Niektóre z nowoczesnych funkcji skrótu (Jenkins 3, Murmur, prawdopodobnie CityHash) dają lepszą dystrybucję wyników niż losowe dane wejściowe, które są bardzo podobne.
Należy zauważyć, że początkowa wartość skrótu (5381) nie ma znaczenia dla łańcuchów o równej długości, ale będzie odgrywać rolę w generowaniu różnych wartości skrótu dla łańcuchów o różnych długościach. – yoyo