github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/hash/maphash/maphash.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // パッケージmaphashはバイト列上のハッシュ関数を提供します。 6 // これらのハッシュ関数は、任意の文字列やバイト列を符号なし64ビット整数上の均一な分布にマッピングするために使用されることを意図しています。 7 // ハッシュテーブルやデータ構造の異なるインスタンスごとに個別の [Seed] を使用する必要があります。 8 // 9 // これらのハッシュ関数は、暗号的に安全ではありません。 10 // (暗号的な使用には、crypto/sha256およびcrypto/sha512を参照してください。) 11 package maphash 12 13 // Seedは [Hash] によって計算されるハッシュ関数を選択するランダムな値です。 14 // もし2つのHashが同じSeedを使う場合、任意の入力に対して同じハッシュ値を計算します。 15 // もし2つのHashが異なるSeedを使う場合、任意の入力に対して異なるハッシュ値を計算する可能性が非常に高いです。 16 // 17 // Seedは [MakeSeed] を呼び出すことで初期化する必要があります。 18 // ゼロSeedは初期化されておらず、 [Hash] のSetSeedメソッドで使用することはできません。 19 // 20 // 各Seedの値は単一のプロセスに対してローカルであり、別のプロセスでシリアライズまたは再作成することはできません。 21 type Seed struct { 22 s uint64 23 } 24 25 // Bytesは与えられたシードでbのハッシュを返します。 26 // 27 // Bytesは以下と同等であり、しかもより便利で効率的です: 28 // 29 // var h Hash 30 // h.SetSeed(seed) 31 // h.Write(b) 32 // return h.Sum64() 33 func Bytes(seed Seed, b []byte) uint64 34 35 // Stringは与えられたシードを使ってsのハッシュ値を返します。 36 // 37 // Stringは以下のコードと同等ですが、より便利かつ効率的です: 38 // 39 // var h Hash 40 // h.SetSeed(seed) 41 // h.WriteString(s) 42 // return h.Sum64() 43 func String(seed Seed, s string) uint64 44 45 // Hashはバイトシーケンスのシード付きハッシュを計算します。 46 // 47 // ゼロのHashは使用する準備ができた有効なHashです。 48 // ゼロのHashは、Reset、Write、Seed、またはSum64メソッドの最初の呼び出し時に自動でランダムなシードを選択します。 49 // シードに対する制御には、SetSeedを使用します。 50 // 51 // 計算されたハッシュ値は、初期シードとHashオブジェクトに提供されたバイトのシーケンスにのみ依存し、 52 // バイトの提供方法には依存しません。たとえば、以下の3つのシーケンス 53 // 54 // h.Write([]byte{'f','o','o'}) 55 // h.WriteByte('f'); h.WriteByte('o'); h.WriteByte('o') 56 // h.WriteString("foo") 57 // 58 // はすべて同じ効果があります。 59 // 60 // Hashは、ハッシュされるバイトシーケンスを制御する敵対者がいる場合でも、衝突耐性が意図されています。 61 // 62 // Hashは、複数のゴルーチンによる並行使用には安全ではありませんが、Seedは安全です。 63 // 複数のゴルーチンが同じシードを使ってハッシュを計算する必要がある場合、 64 // 各ゴルーチンは独自のHashを宣言し、共通のシードでSetSeedを呼び出すことができます。 65 type Hash struct { 66 _ [0]func() 67 seed Seed 68 state Seed 69 buf [bufSize]byte 70 n int 71 } 72 73 // WriteByteは、hによってハッシュされるバイト列にbを追加します。 74 // 失敗することはありません。エラーの結果は、 [io.ByteWriter] の実装のためです。 75 func (h *Hash) WriteByte(b byte) error 76 77 // Writeはhによってハッシュされたバイトのシーケンスにbを追加します。 78 // bのすべてを書き込み、失敗することはありません。countとerrorの結果は [io.Writer] を実装するためです。 79 func (h *Hash) Write(b []byte) (int, error) 80 81 // WriteString は文字列 s のバイト列を h によってハッシュ化されたバイト列に追加します。 82 // いつでも s のすべてを書き込み、失敗することはありません。count と error の結果は [io.StringWriter] の実装のためです。 83 func (h *Hash) WriteString(s string) (int, error) 84 85 // Seedはhのシード値を返します。 86 func (h *Hash) Seed() Seed 87 88 // SetSeedは、hにseedを使用するように設定します。 89 // seedは [MakeSeed] によって返されたか、別のハッシュのSeedメソッドによって返されたものでなければなりません。 90 // 同じseedを持つ2つの [Hash] オブジェクトは同じように振る舞います。 91 // 異なるseedを持つ2つの [Hash] オブジェクトは、非常に異なる振る舞いをする可能性があります。 92 // この呼び出し前にhに追加されたすべてのバイトは破棄されます。 93 func (h *Hash) SetSeed(seed Seed) 94 95 // Resetはhに追加されたすべてのバイトを破棄します。 96 // (シードは変わりません。) 97 func (h *Hash) Reset() 98 99 // Sum64はhの現在の64ビット値を返します。これは、hのシードと、hに追加されたバイトのシーケンスに依存します。 100 // 最後の [Hash.Reset] または [Hash.SetSeed] の呼び出しからの呼び出しを含みます。 101 // Sum64の結果のすべてのビットはほぼ均等に一様に分布しており、独立しているため、 102 // ビットマスキング、シフト、またはモジュラ演算で安全に縮小することができます。 103 func (h *Hash) Sum64() uint64 104 105 // MakeSeed は新しいランダムなシードを返す。 106 func MakeSeed() Seed 107 108 // Sumはハッシュの現在の64ビット値をbに追加します。 109 // [hash.Hash] の実装のために存在します。 110 // 直接の呼び出しでは、 [Hash.Sum64] を使用する方が効率が良いです。 111 func (h *Hash) Sum(b []byte) []byte 112 113 // Sizeはhのハッシュ値のサイズ、8バイトを返します。 114 func (h *Hash) Size() int 115 116 // BlockSize は h のブロックサイズを返します。 117 func (h *Hash) BlockSize() int