英語版
このページの英語版を見る

std.digest.murmurhash

任意のデータの を計算する。MurmurHashは非暗号化ハッシュ関数である。 一般的なハッシュベースの検索に適している。x86用に最適化されているが、すべてのアーキテクチャで使用できる。 すべてのアーキテクチャで使用できる。
現在のバージョンはMurmurHash3で、32ビットまたは128ビットのハッシュ値が得られる。 旧バージョンのMurmurHash1と2は現在サポートされていない。
MurmurHash3には3つのフレーバーがあり、スループットの高い順に並んでいる:
  • MurmurHash3!32 32ビット値を生成し、32ビット・アーキテクチャに最適化されている。
  • MurmurHash3!(128, 32) 128ビット値を生成し、32ビット・アーキテクチャに最適化されている。
  • MurmurHash3!(128, 64) 128ビット値を生成し、64ビット・アーキテクチャに最適化されている。

注釈

  • MurmurHash3!(128, 32) と は異なる値を生成する。MurmurHash3!(128, 64)
  • 現在の実装はリトルエンディアン・アーキテクチャに最適化されている。 ビッグエンディアン・アーキテクチャでは異なる結果となり、分布も若干一様でなくなる。 一様でない分布を示すだろう。
このモジュールは std.digest.
このモジュールは "重要:"を公にインポートしている。 std.digestを公的にインポートしており、独立したモジュールとして使用できる。

Authors:
Guillaume Chatelet
Examples:
// MurmurHash3!32、MurmurHash3!(128, 32)、MurmurHash3!(128, 64)は
// std.digest Template APIを実装している。
static assert(isDigest!(MurmurHash3!32));
// 便利なダイジェストテンプレートにより、あらゆるデータを素早くハッシュ化できる。
ubyte[4] hashed = digest!(MurmurHash3!32)([1, 2, 3, 4]);
writeln(hashed); // [0, 173, 69, 68]
Examples:
// ハッシュ関数をインスタンス化して'put'メソッドを呼び出すことで、ubyteデータを
// 分割してハッシュ化することもできる。
const(ubyte)[] data1 = [1, 2, 3];
const(ubyte)[] data2 = [4, 5, 6, 7];
// 入力データは、要素ごとにバッファリングされ、ハッシュ化される。
MurmurHash3!32 hasher;
hasher.put(data1);
hasher.put(data2);
// 'finish'の呼び出しにより、次のことが保証される:
// - 残りのビットが処理される
// - ハッシュが確定する
auto hashed = hasher.finish();
writeln(hashed); // [181, 151, 88, 252]
Examples:
// `putElements`、`putRemainder`、`finalize`を使用すると、
// アルゴリズムのどの部分を実行するかを完全に制御できる。
// これにより、最大の処理能力を発揮できるが、細心の注意が必要である。

// データ型はハッシュの要素型と同じでなければならない:
// - MurmurHash3!32用のuint
// - MurmurHash3!(128, 32)用のuint[4]
// - MurmurHash3!(128, 64)用のulong[2]
const(uint)[] data = [1, 2, 3, 4];
// hasherは'Fast'で始まることに注意。
MurmurHash3!32 hasher;
// 必要なだけ要素の配列をプッシュする。呼び出し回数は少ないほど良い。
hasher.putElements(data);
// 必要に応じて残りのバイトを入れる。このメソッドは1回しか呼び出せない。
hasher.putRemainder(ubyte(1), ubyte(1), ubyte(1));
// ハッシュにデータ長を組み込むためにfinalizeを呼び出す。
hasher.finalize();
// 最後にハッシュ値を取得する。
auto hashed = hasher.getBytes();
writeln(hashed); // [188, 165, 108, 2]
struct MurmurHash3(uint size, uint opt = size_t.sizeof == 8 ? 64 : 32);
MurmurHash3 関数を実装する。ハッシュのsize をビット単位で指定できる。 ハッシュのビット数を指定できる。128 ビットのハッシュの場合、32 ビットと 64 ビットのどちらのアーキテクチャに最適化するかを指定できる。 または64ビットアーキテクチャに最適化するかを指定できる。opt の値を指定しないと、ホストプラットフォームの最速バージョンが選択される。 ホスト・プラットフォームの最速バージョンを選択する。
このハッシャーはDigest API と互換性がある:
  • void start()
  • void put(scope const(ubyte)[] data...)
  • ubyte[Element.sizeof] finish()
また、以下のサイズのデータを扱う、より高速で低レベルのAPIも提供する。 Element.sizeof:
  • void putElements(scope const(Element[]) elements...)
  • void putRemainder(scope const(ubyte[]) data...)
  • void finalize()
  • Element get()
  • ubyte[Element.sizeof] getBytes()
Examples:
便利なダイジェスト・テンプレートにより、どんなデータでも素早くハッシュ化できる。
ubyte[4] hashed = digest!(MurmurHash3!32)([1, 2, 3, 4]);
writeln(hashed); // [0, 173, 69, 68]
Examples:
ハッシャーをインスタンス化して「put」メソッドを呼び出せば、ubyteデータを分割してハッシュすることもできる。 メソッドを呼び出す。
const(ubyte)[] data1 = [1, 2, 3];
const(ubyte)[] data2 = [4, 5, 6, 7];
// 入力データは、要素ごとにバッファリングされ、ハッシュ化される。
MurmurHash3!32 hasher;
hasher.put(data1);
hasher.put(data2);
// 'finish'の呼び出しにより、次のことが保証される:
// - 残りのビットが処理される
// - ハッシュが確定する
auto hashed = hasher.finish();
writeln(hashed); // [181, 151, 88, 252]
alias Element = uint;
32ビット実装のエレメント型。
pure nothrow @nogc void putElement(uint block);
element_count を増やすことなく、1つのエレメントを追加する。 を呼び出すたびに、element_countElement.sizeof だけ増やすようにする。 putElement.
pure nothrow @nogc void putRemainder(scope const(ubyte[]) data...);
余りのバイトを入れる。これはputElement の後、finalize の前に一度だけ呼び出されなければならない。
pure nothrow @nogc void finalize();
element_count を組み込み、ハッシュを確定する。
pure nothrow @nogc Element get();
ハッシュをuint値として返す。
pure nothrow @nogc ubyte[4] getBytes();
現在のハッシュ値をubyte配列として返す。
pure nothrow @nogc void putElements(scope const(Element[]) elements...);
要素の配列を一度にプッシュする。1回の呼び出しでできるだけ多くのデータをプッシュする方が効率的である。 アンアラインドリードをサポートしないプラットフォーム(MIPSや古いARMチップ)では、コンパイラは正しさを保証するために遅いコードを生成するかもしれない。
pure nothrow void put(scope const(ubyte)[] data...);
消化器にデータを追加する。この関数はstartの後、finishの前に連続して何度も呼び出すことができる。 この関数は、startの後、finishの前に連続して何度も呼び出すことができる。
pure nothrow ubyte[Element.sizeof] finish();
ハッシュの計算を終了し、計算された値を返す。 注釈:」である。 finishは一度しか呼び出すことができない。 put