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做一个指纹,用指纹加索引,方便快速查找。