MurmurHash
#Hash
高速で実装が簡単なハッシュ関数。暗号学的ではない。
MurmurHash1, MurmurHash2, MurmurHash3 の3つのバージョンが存在する。
入力が4バイト整数2つである場合をGLSLで実装すると以下のようになる:
code:glsl
uint murmurHash12(uvec2 src) {
const uint M = 0x5bd1e995u;
uint h = 1190494759u;
src *= M; src ^= src>>24u; src *= M;
h *= M; h ^= src.x; h *= M; h ^= src.y;
h ^= h>>13u; h *= M; h ^= h>>15u;
return h;
}
// 1 output, 2 inputs
float hash12(vec2 src) {
uint h = murmurHash12(floatBitsToUint(src));
return uintBitsToFloat(h & 0x007fffffu | 0x3f800000u) - 1.0;
}
コピペ用に Shadertoy に置いておいた。
https://www.shadertoy.com/view/ttc3zr
HLSL版
code:hlsl
uint MurmurHash13(uint3 src) {
const uint M = 0x5bd1e995u;
uint h = 1190494759u;
src *= M; src ^= src>>24u; src *= M;
h *= M; h ^= src.x; h *= M; h ^= src.y; h *= M; h ^= src.z;
h ^= h>>13u; h *= M; h ^= h>>15u;
return h;
}
// 1 output, 3 inputs
float Hash13(float3 src) {
uint h = MurmurHash13(asuint(src));
return asfloat(h & 0x007fffffu | 0x3f800000u) - 1.0;
}
References
https://github.com/aappleby/smhasher/blob/master/src/MurmurHash2.cpp
https://github.com/aappleby/smhasher/wiki/MurmurHash2