2017-11-29 7 views
-3

私は今、C言語を学習しています。私はCS50 edxコースで構築しているスペルチェッカープログラムのためにこのハッシュ関数を構築していました。なぜビットシフト演算子は私のハッシュ関数を速くするのですか?

int hashing(char *word)  
{ 

    unsigned int hash = 0; 
    for (int i = 0, n = strlen(word); i < n; i++) 
     hash += word[i]; 
    return hash % HTABLE_SIZE; 
} 

それから私は、ビットシフト演算子を使用してのredditにこのhash functionにつまずきました。

int hashing(char *word) 
{ 
    unsigned int hash = 0; 
    for (int i = 0, n = strlen(word); i < n; i++) 
     hash = (hash << 2)^word[i]; 
    return hash % HTABLE_SIZE; 
} 

このハッシュ関数では、プログラムの速度は0.13秒から0.06秒になりました。なぜ誰かがこのハッシュ関数が非常に高速である理由を私に説明できますか?

+0

どのようにプログラムをコンパイルしますか?完全に最適化された? – Evert

+0

https://stackoverflow.com/a/6357747/6935629 – rsp

+1

どのコンパイラを使用していますか?また、オンラインの[Compiler Explorer](https://godbolt.org)を使用して、ソースから生成されたアセンブリコードを確認してください。 –

答えて

1

シフト+ xorは加算よりも速いとは思わない。

ただし、生成されたハッシュテーブルは、ハッシュ値の配布がはるかに優れているため、おそらくはるかに高速です。

関連する問題