golang字符串指纹性能比较

462 阅读1分钟
package hash

import (
	"crypto/md5"
	"crypto/sha1"
	"hash/crc32"
	"hash/crc64"
	"testing"

	"github.com/spaolacci/murmur3"
)

var str = "hello123132sfdsf123safasdf21world"

func md5Hash() [16]byte {
	return md5.Sum([]byte(str))
}

func sha1Hash() [20]byte {
	return sha1.Sum([]byte(str))
}

func crc32Hash() uint32 {
	return crc32.ChecksumIEEE([]byte(str))
}

var h2 = crc64.New(crc64.MakeTable(crc64.ISO))

func crc64HashISO() uint64 {
	h2.Write([]byte(str))
	res := h1.Sum64()
	h2.Reset()
	return res
}

var h1 = crc64.New(crc64.MakeTable(crc64.ECMA))

func crc64HashECMA() uint64 {
	h1.Write([]byte(str))
	res := h1.Sum64()
	h1.Reset()
	return res
}

func murmur32Hash() uint32 {
	return murmur3.Sum32([]byte(str))
}

func murmur64Hash() uint64 {
	return murmur3.Sum64([]byte(str))
}

func BenchmarkMd5(b *testing.B) {
	for i := 0; i < b.N; i++ {
		md5Hash()
	}
}

func BenchmarkSha1(b *testing.B) {
	for i := 0; i < b.N; i++ {
		sha1Hash()
	}
}

func BenchmarkCrc32(b *testing.B) {
	for i := 0; i < b.N; i++ {
		crc32Hash()
	}
}

func BenchmarkCrc64ISO(b *testing.B) {
	for i := 0; i < b.N; i++ {
		crc64HashISO()
	}
}

func BenchmarkCrc64EMAC(b *testing.B) {
	for i := 0; i < b.N; i++ {
		crc64HashECMA()
	}
}

func BenchmarkMur32(b *testing.B) {
	for i := 0; i < b.N; i++ {
		murmur32Hash()
	}
}

func BenchmarkMur64(b *testing.B) {
	for i := 0; i < b.N; i++ {
		murmur64Hash()
	}
}


结果:
BenchmarkMd5-10                  7846959               129.9 ns/op            48 B/op          1 allocs/op
BenchmarkSha1-10                16395775                72.01 ns/op           48 B/op          1 allocs/op
BenchmarkCrc32-10               40656316                29.15 ns/op           48 B/op          1 allocs/op
BenchmarkCrc64ISO-10            10596002               112.8 ns/op            48 B/op          1 allocs/op
BenchmarkCrc64EMAC-10           10379766               116.3 ns/op            48 B/op          1 allocs/op
BenchmarkMur32-10               35429148                33.76 ns/op           48 B/op          1 allocs/op
BenchmarkMur64-10               33781088                35.20 ns/op           48 B/op          1 allocs/op
PASS

结论:murmur3效果最好,在db里面,需要给字符串添加索引,性能较差,可以用murmur3做一个指纹,用指纹加索引,方便快速查找。