2025/04/14 01:02 Fibonacci Hashing: The Optimization That the World Forgot

やっほー、ロボ子!今日のITニュースはハッシュテーブルの話じゃ。

ハッシュテーブルですか、博士。`std::unordered_map`とかで使われている、あれですね。

そうそう!でな、今日のニュースによると、フィボナッチハッシュってのが、整数剰余より優れてるらしいんじゃ。

フィボナッチハッシュ…ですか?初めて聞きました。

フィボナッチ数列と黄金比を使ったハッシュ方法らしいぞ。キーをスロットに均等に分散させるのに役立つらしい。

なるほど。記事によると、`std::unordered_map`などの主要な実装がフィボナッチハッシュを使っていないために速度が遅くなっている、と。

そうなんじゃ!整数剰余だと、速度が遅い上に、入力データに偏りがあると性能がガクッと落ちるらしい。

整数剰余の速度が遅いのは、実装が単純だと時間がかかるからですか?記事には約9ナノ秒とありますね。

そうそう。でもフィボナッチハッシュなら、乗算とシフト演算だけで済むから、約1.5ナノ秒で終わるらしいぞ。

それは速いですね!それに、入力パターンの混合にも役立つ、と。

せやろ?ハッシュ関数からの結果をマッピングする際に、追加のハッシュステップのように機能するらしい。

でも、そんなに良いものなら、なぜ普及していないんでしょう?

それが、ドナルド・クヌース先生の著書でのハッシュ関数の定義が、現代的な定義と違うかららしいんじゃ。

定義の違い、ですか?

クヌース先生は、キーのハッシュ化とスロットへの割り当てを両方行うものをハッシュ関数と定義したらしい。今はハッシュ化だけを指すことが多いからの。

なるほど。Wikipediaなどの情報源で、乗算ハッシュが衝突率が高いとされていることも影響しているんですね。

そうそう。でも、フィボナッチハッシュは厳密アバランチ基準に近いかどうかをテストすると、情報の損失はないらしいぞ。

厳密アバランチ基準…ですか?

入力ビットの変化が出力ビットに50%の確率で影響を与えるのが理想らしいんじゃ。フィボナッチハッシュは完全ではないけど、悪くないってことじゃ。

改善策もあるんですね。上位ビットをシフトしてXORすることで、パターンを改善できる、と。

せやろ?結論としては、フィボナッチハッシュは大きな数値範囲を小さな数値範囲にマッピングする最良の方法の一つで、整数剰余より高速で問題が少ないってことじゃ。

特定のパターンにはカスタムハッシュ関数で対応できる、と。

そうなんじゃ。ちなみに、私のハッシュテーブル実装(flat_hash_mapなど)では、フィボナッチハッシュがデフォルトで使われてるぞ!

さすが博士です!

まあ、たまには失敗もあるけどな!例えば、この前、ハッシュテーブルに猫の写真を入れようとしたら、全部同じスロットに入っちゃって、猫だらけになっちゃった、てへ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
