- ベストアンサー
初めてのハッシュ関数を理解しよう!
- ハッシュ関数についての基礎知識、計算速度と一様な分布の重要性について説明します。
- ハッシュ関数を使用したサンプルコードの解説と、いくつかの簡単なハッシュ関数の提案を行います。
- ハッシュ関数の選び方についての不安を相談し、適切な選択肢についてアドバイスを求めます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
IndexとValueの分布が多そうな部分同士は被らなさそうなので単純にIndex+Valueでもいいかも。
その他の回答 (2)
- wormhole
- ベストアンサー率28% (1626/5665)
Valueが一様に分布するならValueをそのまま使ってもよさそうな気もしますが、考えられるIndexとValueで得られるハッシュ値の検証プログラムを組んで確かめた方がよいとは思います。 ところでハッシュ値が重複した場合はどうするかは考えてありますか?
お礼
回答ありがとうございます。少しだけ抜けていました。 Valueはほとんど一様に分布するのですが、良く考えていなかったのですが、100~4、5000位の間で一様に分布するの間違いでした。あまり大きな値はめったに使わないので思い込んでいました。 ---------------------------------- / ̄ ̄ ̄ ̄\ _/ \_______ 100 5000 ---------------------------------- ↑Valueはこんな感じで分布するはず 重複の問題は既存のハッシュテーブルに任せるので問題ないです(重複分だけループ&チェックされるはず)。
- wormhole
- ベストアンサー率28% (1626/5665)
ハッシュテーブルを使って何をしたいのでしょうか? IndexをキーとしてValueを求めるためのハッシュテーブルということであればハッシュ値にValueを含めるとダメです(Valueを求めるためにValueもわかってないといけなくなる)。 またパターンA~CにしてもIndexとValueの範囲がわかっても分布がわからないので何ともいえません。 極端な例ですが、Indexが重複することがないのならIndexの値そのものをハッシュ値としても問題ありません。
お礼
回答ありがとうございます。 > IndexをキーとしてValueを求めるためのハッシュテーブルということであれば > ハッシュ値にValueを含めるとダメです > (Valueを求めるためにValueもわかってないといけなくなる)。 いえいえ、そうではなくて、別の配列などに対するインデックスと、操作に用いるための値を格納した構造体ですので、イメージとしてはUndo, Redo用の操作の記録とあまり変わらないと思います(「Index=4をValue=12に変える」のような感じ。ほんとはもうちょっと複雑ですが)。 > またパターンA~CにしてもIndexとValueの範囲がわかっても > 分布がわからないので何ともいえません。 失礼しました。 ・Valueは一様に分布 ・Indexは10~30くらいを中心にガウス分布っぽい形 (かなり低い方ににピークが寄っています) のはずです。
お礼
あれっ!? そんな簡単なものでもいいのですか? 状況によってぜんぜんちがうものなんですね。 僕が一回見せてもらったハッシュ関数は何だか4~6行ぐらいあったので、ハッシュ関数って、もっと複雑なものかと……。 とりあえず、他にも色々な記事を読んで理解は深まりました。ありがとうございました。