[解決済み] 文字列のハッシュ関数
質問
現在、私の授業でハッシュ関数を扱っています。講師は、私たちのコードで使用した2つのハッシュ関数と比較するために、インターネット上のハッシュ関数に尋ねました。
1つ目は
int HashTable::hash (string word)
// POST: the index of entry is returned
{ int sum = 0;
for (int k = 0; k < word.length(); k++)
sum = sum + int(word[k]);
return sum % SIZE;
}
2番目
int HashTable::hash (string word)
{
int seed = 131;
unsigned long hash = 0;
for(int i = 0; i < word.length(); i++)
{
hash = (hash * seed) + word[i];
}
return hash % SIZE;
}
SIZEは501(ハッシュテーブルのサイズ)、入力は20,000語以上のテキストファイルからです。
見た これ の質問で、いくつかのコード例を挙げていますが、ハッシュ関数で何を探せばいいのかよくわかりませんでした。私の理解が正しければ、私の場合、ハッシュは入力(文字列)を受け取り、文字列に番号を割り当てるために数学的な計算を行い、それをテーブルに挿入するのです。この処理は、リストの検索速度を向上させるために行われるのですか?
もし私の論理が正しいのであれば、どなたか文字列を含む別のハッシュ関数を示す良い例や資料をお持ちではないでしょうか?あるいは、私自身の効率的なハッシュ関数を書くプロセスも。
どのように解決するのですか?
まず、実際にはそれほど重要ではありません。ほとんどのハッシュ関数は「十分」です。
でも、もし本当に気になるのなら、それ自体が研究テーマであることを知っておくべきです。それに関する論文は何千と出ています。ハッシュアルゴリズムを研究・設計することで、今日でも博士号を取得することができるのです。
2番目のハッシュ関数は少し優れているかもしれません。なぜなら、この関数は文字列
"ab"
という文字列から
"ba"
. 一方、最初のハッシュ関数に比べると、速さは劣るだろう。これは、あなたのアプリケーションに関係するかもしれないし、ないかもしれない。
ゲノムの文字列に使われるハッシュ関数と、電話データベースの姓名判断に使われるハッシュ関数はかなり違うと思う。おそらく、文字列のハッシュ関数でも、英語やフランス語の単語よりもドイツ語の方が適しているものがあるのだろう。
多くのソフトウェア・ライブラリは十分なハッシュ関数を提供しており、例えば Qt は
qhash
であり、C++11には
std::hash
で
<functional>
Glibにはいくつかの
ハッシュ関数
をCで、そして
POCO
には、いくつかの
ハッシュ
関数を使用します。
私はよく、素数を含むハッシュ関数( ベゾーのアイデンティティ ) と xor のようなものである。
#define A 54059 /* a prime */
#define B 76963 /* another prime */
#define C 86969 /* yet another prime */
#define FIRSTH 37 /* also prime */
unsigned hash_str(const char* s)
{
unsigned h = FIRSTH;
while (*s) {
h = (h * A) ^ (s[0] * B);
s++;
}
return h; // or return h % C;
}
しかし、私はハッシュの専門家だとは思っていない。もちろん
A
,
B
,
C
,
FIRSTH
は素数であることが望ましいが、他の素数を選ぶことも可能である。
いくつか見てみましょう。 MD5 を実装して、ハッシュ関数がどのようなものになり得るかを感じ取ってください。
アルゴリズムに関する良書には、少なくとも一章がハッシュに割かれています。のウィキページから始めてください。 ハッシュ関数 &です。 ハッシュテーブル .
関連
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] 文字列のハッシュ関数