掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Generics.Collections.TDictionary の ContainsValue (ID:40021)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>GetHashCodeはかなりいい加減に作っても期待通り動作するのがなんとも・・。 >ハッシュ値が全部同じになってもなんだか動くんですね・・・?このあたりサッパリわかっておりません。 TDictionaryの場合、使用するハッシュ値はたかだか32bitですから、 どれだけ高性能なハッシュ関数を使ったところで必ず衝突します。 ですので、衝突した場合は内部的にずらして格納するようにできています。 しかしハッシュ値が衝突すると格納時、読み出し時に多くの無駄な処理が発生し、 適当に書いても動くからと言って疎かにすると、速度が非常に遅くなります。 最悪の場合配列をforで回して探すより遅いですから、TDictionaryを使う意味がなくなりますね。 幸いハッシュ関数は高性能なものがGenerics.Defaultsに実装されていますので、 (function BobJenkinsHash(const Data; Len, InitData: Integer): Integer) これを使えば高頻度の衝突は避けられると思います。 使い方は、例えば文字列変数 S のハッシュを取る場合、 Result := BobJenkinsHash(S[1], Length(S) * SizeOf(S[1]), 0); というようにします。 最後の引数は何を指定しても良いのですが、通常は0を指定すれば問題ありません。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.