MGL::Hash FNV1a#

概要#

FNV1aアルゴリズムによる、文字列からハッシュ値を算出するための定義と定数式です。

FNV1aは乗算とXORで算出するハッシュアルゴリズムです。高速に動作し、衝突対策を取りやすく、C++においてはコンパイル時に算出可能という特徴があります。これは、あらかじめ用意された有限のリソースを高速に判別したい場合に有効で、ゲームプログラミングとは非常に相性の良いアルゴリズムです。

警告

FNV1aアルゴリズムは暗号学的ハッシュ関数の要件を満たしません。暗号処理や改竄チェック等の実装にこのアルゴリズムを使用しないでください。

定数#

名前

内容

kFNV1aDefaultValue32

32bitハッシュ値生成のデフォルト値

0xA3F6C23E

kFNV1aDefaultValue64

64bitハッシュ値生成のデフォルト値

0xC18F36FE9A341BC5

関数・定数式#

種類

名前

内容

定数式

FNV1a

32bitハッシュ値生成

定数式

FNV1a64

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;
}