unsigned long djb2_hash(const char *str) {
unsigned long hash = 5381;
int c;
while ((c = *str++)) {
hash = ((hash << 5) + hash) + c; // hash * 33 + c
}
return hash;
}
このコードでは、djb2アルゴリズムの基本的な実装が示されています。ハッシュ値の初期値として5381が使われ、文字列の各文字に対してハッシュ値が更新されます。ハッシュ値の更新式は、(hash << 5) + hash + c
となっており、これはhash * 33 + c
と等価です。この更新式は、ハッシュ値を左シフトして33倍し、現在の文字のASCIIコードを加算するものです。
このアルゴリズムは単純でありながら効果的なハッシュ関数として知られています。そのため、文字列のハッシュ値を求めるために広く利用されています。ただし、djb2アルゴリズムは衝突(異なる文字列が同じハッシュ値を生成すること)が起こりやすいという特徴も持っています。そのため、高いセキュリティ要求がある場合や、完全なランダム性が求められる場合には、より強力なハッシュ関数を使用することが推奨されます。
以上がC言語でのdjb2アルゴリズムのコード例と解説です。ハッシュ関数の基本的な実装方法を理解する上で参考になるでしょう。