func MurmurHash64A(data []byte, seed uint64) (h uint64) {
	var k uint64
	h = seed ^ uint64(len(data))*BIG_M
	for l := len(data); l >= 8; l -= 8 {
		k = uint64(data[0]) | uint64(data[1])<<8 | uint64(data[2])<<16 | uint64(data[3])<<24 |
			uint64(data[4])<<32 | uint64(data[5])<<40 | uint64(data[6])<<48 | uint64(data[7])<<56
		k *= BIG_M
		k ^= k >> BIG_R
		k *= BIG_M
		h ^= k
		h *= BIG_M
		data = data[8:]
	}
	switch len(data) {
	case 7:
		h ^= uint64(data[6]) << 48
		fallthrough
	case 6:
		h ^= uint64(data[5]) << 40
		fallthrough
	case 5:
		h ^= uint64(data[4]) << 32
		fallthrough
	case 4:
		h ^= uint64(data[3]) << 24
		fallthrough
	case 3:
		h ^= uint64(data[2]) << 16
		fallthrough
	case 2:
		h ^= uint64(data[1]) << 8
		fallthrough
	case 1:
		h ^= uint64(data[0])
		h *= BIG_M
	}
	h ^= h >> BIG_R
	h *= BIG_M
	h ^= h >> BIG_R
	return
}
-----------------------------------------------------------------------------
MurmurHash64A (64-bit) algorithm by Austin Appleby.
package murmur
import (
	"hash"
)
const (
	M     = 0x5bd1e995
	BIG_M = 0xc6a4a7935bd1e995
	R     = 24
	BIG_R = 47
)
func mmix(h uint32, k uint32) (uint32, uint32) {
	k *= M
	k ^= k >> R
	k *= M
	h *= M
	h ^= k
	return h, k
}
func MurmurHash2(data []byte, seed uint32) (h uint32) {
	var k uint32
	h = seed ^ uint32(len(data))
	for l := len(data); l >= 4; l -= 4 {
		k = uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16 | uint32(data[3])<<24
		h, k = mmix(h, k)
		data = data[4:]
	}
	switch len(data) {
	case 3:
		h ^= uint32(data[2]) << 16
		fallthrough
	case 2:
		h ^= uint32(data[1]) << 8
		fallthrough
	case 1:
		h ^= uint32(data[0])
		h *= M
	}
	h ^= h >> 13
	h *= M
	h ^= h >> 15
	return
}