作成日
2014/12/28最終更新
2018/09/07記事区分
一般公開暗号技術で有名な MD5 や SHA-1, SHA-2 (SHA-256など) はハッシュ関数です。ハッシュ関数はある集合 A から別のある集合 B への写像関数のようなもので、集合 A の要素 a を入力として実行すると集合 B の要素 b が出力されます。このとき要素 b のことを要素 a のハッシュ値とよびます。また、集合 A の要素と集合 B の要素の対応表をハッシュ表とよびます。一般に集合 A をハッシュ関数に通すと、圧縮された集合 B が出力されます。つまり、集合 A の異なる a1 と a2 を入力すると集合 B の同じ値 b が出力されることがあります。
二分探索木 (集合や連想配列) などのデータ構造とハッシュ関数を組み合せると、データ構造だけを利用してデータを管理する場合と比較して検索性を向上させることができます。これをハッシュ法とよびます。ハッシュ法におけるハッシュ関数には処理時間がかからないことが求められます。
ハッシュ法の実装例
#include <iostream>
#include <map>
using namespace std;
class MyHash {
public:
static const size_t HASH_TBL_SIZE = 23;
static size_t Get(const string& value);
public:
string& operator[](const string& key);
private:
map<string, string> m_hashTable[HASH_TBL_SIZE];
};
size_t MyHash::Get(const string& value) {
size_t size = value.size();
const unsigned char* p
= reinterpret_cast<const unsigned char*>(value.data());
return (p[0] + p[size /2] + p[size - 1]) % HASH_TBL_SIZE;
}
string& MyHash::operator[](const string& key) {
return m_hashTable[Get(key)][key];
}
int main() {
MyHash h;
h["one"] = "ichi";
h["two"] = "ni";
cout << h["one"] << endl; //=> ichi
cout << h["two"] << endl; //=> ni
return 0;
}
関連記事
- ダウンキャスト (C++をもう一度)実行時型情報 RTTI #include <iostream> #include <typeinfo> using namespace std; class MyClass { public: virtual ~MyClass() {} // typeid で正しい RTTI // (RunTime Type Information; 実行時型情報) ...
- 競技プログラミングの基本処理チートシート (C++)限られた時間の中で問題を解くために必要となる、競技プログラミングにおける基本的な処理のチートシートです。競プロにおけるメジャー言語 C++ を利用します。その際 C++11 の機能は利用せず C++03 の機能の範囲内で記述します。 頻度高く定期的に開催されるコンテスト AtCoder Codeforces main.cpp #include <iostream>
- 構造体と列挙体 (C++をもう一度)構造体 #include <iostream> using namespace std; struct MyStruct { char charval; int intval; }; void Show(MyStruct* obj) { cout << obj->intval << endl; } int main() { ...
- Valgrind による C/C++ メモリリーク検出JVM メモリリークでは JDK の jstat や jmap で原因を調査できます。C/C++ では valgrind の Memcheck ツールが利用できます。valgrind には複数のツールが含まれており既定のツールが Memcheck です。他のツールを利用する場合は --tool オプションで指定します。 [簡単な利用例](h
- クラスの基本/初期化 (C++をもう一度)構造体のように初期化する (非推奨) #include <iostream> using namespace std; const int MAX_STR = 16; class MyClass { public: int m_integer; char m_str[MAX_STR + 1]; void Show(); }; void MyClass::Show...