hash:
- map / set
系 の実装 が、キーごとの具体的 な関数名 に依存 せずHashtrait経由 でハッシュを取得 できるようにします。 i32やstrのような既存 キー型を、共通 helper から同一 の流儀 で扱 えるようにします。
返 り値 は 32-bit の整数 で、現在 の stdlib が採用 しているalloc/hash/hash32::hash32overload の分布 を再利用 します。- trait
Hashがhash32 <(Self)->i32>を要求 し、helperhash32_by_traitが呼 び出 しを集約 します。
暗号 ハッシュではありません。永続化 や通信 で安定 した識別子 として使 うものではなく、主 に内部 の分散 のために使 います。同値 とHashの実装 は整合 している必要 があります。
i32は O(1) です。strは文字列長 を n として O(n) です。
TEST
#entry main
#target std
#import "std/test" as *
#import "core/traits/hash" as *
fn main <()*>i32> ():
assert_eq_i32 hash32_by_trait 123456 hash32_by_trait 123456;
assert ne hash32_by_trait 123456 hash32_by_trait 123457;
0Hash: map / set
型 ごとのハッシュ計算 を trait として宣言 し、連想配列 や集合 の実装 を共通化 します。
Eq相当 の同値性 と矛盾 しないように実装 する必要 があります。
hash32_by_trait: Hash trait
- trait
呼 び出 しを 1箇所 へ集約 し、collections側 が具体的 な関数名 へ依存 しないようにします。
Hash::hash32をそのまま呼 びます。
型推論 が曖昧 な場合 は周囲 の型注釈 で解決 します。
実際 の計算量 は対象 型のHash実装 に従 います。
Hash<i32>: i32
i32を連想配列 や集合 のキーに使 えるようにします。
alloc/hash/hash32::hash32overload を利用 します。
- O(1)
Hash<bool>: bool を 0/1 として
boolを小 さな離散 キーとして扱 えるようにします。
boolをi32へ cast してからhash32に委譲 します。
- O(1)
Hash<u8>: u8 を 0..255 の
文字 や小 さな分類値 を集合 や表 のキーへ使 えるようにします。
u8をi32に拡張 してhash32に渡 します。
- O(1)
Hash<i64>: i64 を 32-bit に
i64を広 い整数 キーとして使 うときの基本 ハッシュを提供 します。
上位 32-bit と下位 32-bit を XOR で折 りたたみ、その結果 をhash32に通 します。
衝突 は理論上 ありえますが、内部 のハッシュテーブル用途 としては十分 です。
- O(1)
Hash<str>: str の UTF-8
strを文字列 キーとして連想配列 や集合 に使 えるようにします。
alloc/hash/hash32::hash32overload を利用 します。
- UTF-8 の
文字数 ではなくバイト列 に対 して計算 します。
文字列長 を n として O(n)