MGL::Hash FNV1a
Contents
MGL::Hash FNV1a#
概要#
FNV1aアルゴリズムによる、文字列からハッシュ値を算出するための定義と定数式です。
FNV1aは乗算とXORで算出するハッシュアルゴリズムです。高速に動作し、衝突対策を取りやすく、C++においてはコンパイル時に算出可能という特徴があります。これは、あらかじめ用意された有限のリソースを高速に判別したい場合に有効で、ゲームプログラミングとは非常に相性の良いアルゴリズムです。
警告
FNV1aアルゴリズムは暗号学的ハッシュ関数の要件を満たしません。暗号処理や改竄チェック等の実装にこのアルゴリズムを使用しないでください。
定数#
名前 |
内容 |
値 |
---|---|---|
32bitハッシュ値生成のデフォルト値 |
0xA3F6C23E |
|
64bitハッシュ値生成のデフォルト値 |
0xC18F36FE9A341BC5 |
関数・定数式#
種類 |
名前 |
内容 |
---|---|---|
定数式 |
32bitハッシュ値生成 |
|
定数式 |
64bitハッシュ値生成 |
kFNV1aDefaultValue32#
32bitハッシュ値を生成する際に利用するデフォルト値です。
宣言#
namespace MGL::Hash
{
constexpr uint32_t kFNV1aDefaultValue32 = 0xA3F6C23E;
}
説明#
32bitハッシュ値を生成する際に利用するデフォルトの値です。ハッシュ値を算出する際、初期値を変更する事で異なるハッシュ値が算出されますが、指定しなかった場合はこの値が利用されます。
関連#
kFNV1aDefaultValue64#
64bitハッシュ値を生成する際に利用するデフォルト値です。
宣言#
namespace MGL::Hash
{
constexpr uint64_t kFNV1aDefaultValue64 = 0xC18F36FE9A341BC5;
}
説明#
64bitハッシュ値を生成する際に利用するデフォルトの値です。ハッシュ値を算出する際、初期値を変更する事で異なるハッシュ値が算出されますが、指定しなかった場合はこの値が利用されます。
関連#
FNV1a#
文字列から32bitハッシュ値を生成するための定数式です。
宣言#
namespace MGL::Hash
{
constexpr uint32_t FNV1a(
const char *str,
const uint32_t value = Hash::kFNV1aDefaultValue32) noexcept;
}
引数#
- const char *str
ハッシュ化する文字列
- const uint32_t value
ハッシュ生成に利用する初期値。省略時はkFNV1aDefaultValue32
戻り値#
- uint32_t
生成されたハッシュ値
説明#
引数で受けた文字列をハッシュ化して返します。
value
を変更する事で、異なるパターンでハッシュ値を生成します。ハッシュ値が衝突を起こす場合はこの値を変更することで解決する場合があります。value
を省略した場合はkFNV1aDefaultValue32が指定されます。
利用例#
// 文字列"any string."からハッシュ値を算出
auto hash = MGL::Hash::FNV1a("any string."); // hash = 0x135F6625
// 定数式でありコンパイル時に定数に置き換えられるため、
// switchによる文字列分岐にも利用可能
const char *string = "...";
switch (MGL::Hash::FNV1a(string))
{
case MGL::Hash::FNV1a("foo"):
printf("string is foo.\n");
break;
case MGL::Hash::FNV1a("var"):
printf("string is var.\n");
break;
default:
break;
}
FNV1a64#
文字列から64bitハッシュ値を生成するための定数式です。
宣言#
namespace MGL::Hash
{
constexpr uint64_t FNV1a64(
const char *str,
const uint64_t value = Hash::kFNV1aDefaultValue64) noexcept;
}
引数#
- const char *str
ハッシュ化する文字列
- const uint64_t value
ハッシュ生成に利用する初期値。省略時はkFNV1aDefaultValue64
戻り値#
- uint64_t
生成されたハッシュ値
説明#
引数で受けた文字列をハッシュ化して返します。
value
を変更する事で、異なるパターンでハッシュ値を生成します。ハッシュ値が衝突を起こす場合はこの値を変更することで解決する場合があります。value
を省略した場合はkFNV1aDefaultValue64が指定されます。
利用例#
// 文字列"any string."からハッシュ値を算出
auto hash = MGL::Hash::FNV1a64("any string."); // hash = 0x0234608982DCAFC4
// 定数式でありコンパイル時に定数に置き換えられるため、
// switchによる文字列分岐にも利用可能
const char *string = "...";
switch (MGL::Hash::FNV1a64(string))
{
case MGL::Hash::FNV1a64("foo"):
printf("string is foo.\n");
break;
case MGL::Hash::FNV1a64("var"):
printf("string is var.\n");
break;
default:
break;
}