func Murmur3A(key []byte, seed uint32) uint32 {
	nblocks := len(key) / 4
	var h1 = seed
	var c1 uint32 = 0xcc9e2d51
	var c2 uint32 = 0x1b873593
	for i := 0; i < nblocks; i++ {
		k1 := binary.LittleEndian.Uint32(key[i*4:])  
		k1 *= c1
		k1 = rotl32(k1, 15)
		k1 *= c2
		h1 ^= k1
		h1 = rotl32(h1, 13)
		h1 = h1*5 + 0xe6546b64
	}
	var tail = key[nblocks*4:]  
	var k1 uint32
	switch len(key) & 3 {
	case 3:
		k1 ^= uint32(tail[2]) << 16
		fallthrough
	case 2:
		k1 ^= uint32(tail[1]) << 8
		fallthrough
	case 1:
		k1 ^= uint32(tail[0])
		k1 *= c1
		k1 = rotl32(k1, 15)
		k1 *= c2
		h1 ^= k1
	}
	h1 ^= uint32(len(key))
	h1 = fmix32(h1)
	return h1
}
MurmurHash3 for x86, 32-bit (MurmurHash3_x86_32)
package murmurhash3
import (
	"encoding/binary"
	"hash"
)
type (
	murmurhash3A uint32
	murmurhash3C uint32
	murmurhash3F uint64
)
func New3A() hash.Hash32 {
	var m murmurhash3A
	return &m
}
func (m *murmurhash3A) Reset() { *m = 0 }
func (m *murmurhash3A) Size() int {
	return 4
}
func (m *murmurhash3A) BlockSize() int {
	return 4
}
func (m *murmurhash3A) Write(p []byte) (n int, err error) {
	*m = murmurhash3A(Murmur3A(p, uint32(*m)))
	return len(p), nil
}
func (m *murmurhash3A) Sum32() uint32 {
	return uint32(*m)
}
func (m *murmurhash3A) Sum(in []byte) []byte {
	v := uint32(*m)
	return append(in, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
}
func New3C() hash.Hash32 {
	var m murmurhash3C
	return &m
}
func (m *murmurhash3C) Reset() { *m = 0 }
func (m *murmurhash3C) Size() int {
	return 4
}
func (m *murmurhash3C) BlockSize() int {
	return 16
}
func (m *murmurhash3C) Write(p []byte) (n int, err error) {
	*m = murmurhash3C(Murmur3C(p, uint32(*m))[0])
	return len(p), nil
}
func (m *murmurhash3C) Sum32() uint32 {
	return uint32(*m)
}
func (m *murmurhash3C) Sum(in []byte) []byte {
	v := uint32(*m)
	return append(in, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
}
func New3F() hash.Hash64 {
	var m murmurhash3F
	return &m
}
func (m *murmurhash3F) Reset() { *m = 0 }
func (m *murmurhash3F) Size() int {
	return 8
}
func (m *murmurhash3F) BlockSize() int {
	return 16
}
func (m *murmurhash3F) Write(p []byte) (n int, err error) {
	*m = murmurhash3F(Murmur3F(p, uint64(*m))[0])
	return len(p), nil
}
func (m *murmurhash3F) Sum64() uint64 {
	return uint64(*m)
}
func (m *murmurhash3F) Sum(in []byte) []byte {
	v := uint64(*m)
	return append(in, byte(v>>56), byte(v>>48), byte(v>>40), byte(v>>32), byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
}
func rotl32(x uint32, r uint8) uint32 {
	return (x << r) | (x >> (32 - r))
}
func rotl64(x uint64, r uint8) uint64 {
	return (x << r) | (x >> (64 - r))
}
func fmix32(h uint32) uint32 {
	h ^= h >> 16
	h *= 0x85ebca6b
	h ^= h >> 13
	h *= 0xc2b2ae35
	h ^= h >> 16
	return h
}
func fmix64(h uint64) uint64 {
	h ^= h >> 33
	h *= 0xff51afd7ed558ccd
	h ^= h >> 33
	h *= 0xc4ceb9fe1a85ec53
	h ^= h >> 33
	return h
}