func (m *murmur32) Write(data []byte) (n int, err error) {
	n = len(data)
	m.size += uint32(n)
	data = m.mixTail(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
		m.hash, k = mmix(m.hash, k)
		data = data[4:]
	}
	m.mixTail(data)  
	return
}
Add some data to the running hash.
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
}
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
}
func MurmurHash2A(data []byte, seed uint32) (h uint32) {
	var k, t, ln uint32
	ln = uint32(len(data))
	h = seed
	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:
		t ^= uint32(data[2]) << 16
		fallthrough
	case 2:
		t ^= uint32(data[1]) << 8
		fallthrough
	case 1:
		t ^= uint32(data[0])
	}
	h, _ = mmix(h, t)
	h, _ = mmix(h, ln)
	h ^= h >> 13
	h *= M
	h ^= h >> 15
	return
}
type (
	murmur32 struct {
		seed  uint32
		hash  uint32
		tail  uint32
		count uint32
		size  uint32
	}
)
func New32(seed uint32) hash.Hash32 {
	return &murmur32{seed, seed, 0, 0, 0}
}
func (m *murmur32) mixTail(data []byte) []byte {
	for l := len(data); l > 0 && (l < 4 || m.count > 0); l-- {
		m.tail |= uint32(data[0]) << (m.count * 8)
		m.count++
		if m.count == 4 {
			m.hash, _ = mmix(m.hash, m.tail)
			m.tail = 0
			m.count = 0
		}
		data = data[1:]
	}
	return data
}
func (m *murmur32) Reset() {
	m.hash = m.seed
	m.tail = 0
	m.count = 0
	m.size = 0
}