首页 > 其他分享 >常用Hash函数速度比较

常用Hash函数速度比较

时间:2024-04-02 19:25:51浏览次数:23  
标签:BenchmarkMurmur3 常用 Hash 函数 19 hash ns string op

常用Hash函数速度比较

结论

常见的这些Hash函数, 没有数量级上的差别, 当然这只是针对在长度为20000以内的字符串所得出的结论.

如果是对文件进行摘要, 请还是使用非可逆的Hash函数, 而不是crc / murmur 这类

  1. crc​的性能非常出色, 但是与murmur3​的性能没有拉开差距, 由于其内置在标准库中, 因此可以直接使用, 推荐!
  2. md5 / sha​在string长度较小的情况下, 性能表现并不差, 如果对于可逆性有一定追求, 并且追求可能得更好的敛散性, 可以使用.
  3. sha3-512 ​的性能约为crc​的8倍, 如果调用频率较高时, 请注意可能会带来较高的CPU耗时.

测试脚本见文末.

Len(Key) = 20

goos: windows
goarch: amd64
pkg: hash_compare
cpu: 12th Gen Intel(R) Core(TM) i7-12700K
BenchmarkMD5
BenchmarkMD5-19                  8822782               135.7 ns/op
BenchmarkSHA1
BenchmarkSHA1-19                 8182909               145.1 ns/op
BenchmarkSHA256
BenchmarkSHA256-19              10178547               116.2 ns/op
BenchmarkSHA512
BenchmarkSHA512-19               4528038               267.6 ns/op
BenchmarkSHA3_256
BenchmarkSHA3_256-19             2184250               556.6 ns/op
BenchmarkSHA3_512
BenchmarkSHA3_512-19             2206112               541.4 ns/op
BenchmarkCRC32
BenchmarkCRC32-19               12400216                99.20 ns/op
BenchmarkCRC64
BenchmarkCRC64-19               15547041                78.54 ns/op
BenchmarkMurmur3_32
BenchmarkMurmur3_32-19          11555438               108.0 ns/op
BenchmarkMurmur3_128
BenchmarkMurmur3_128-19          9971091               115.9 ns/op

Len(Key) = 50

goos: windows
goarch: amd64
pkg: hash_compare
cpu: 12th Gen Intel(R) Core(TM) i7-12700K
BenchmarkMD5
BenchmarkMD5-19                  6289884               192.0 ns/op
BenchmarkSHA1
BenchmarkSHA1-19                 5622404               217.4 ns/op
BenchmarkSHA256
BenchmarkSHA256-19               6940231               174.1 ns/op
BenchmarkSHA512
BenchmarkSHA512-19               3849984               318.2 ns/op
BenchmarkSHA3_256
BenchmarkSHA3_256-19             2014849               593.4 ns/op
BenchmarkSHA3_512
BenchmarkSHA3_512-19             2100302               583.7 ns/op
BenchmarkCRC32
BenchmarkCRC32-19                8180628               147.6 ns/op
BenchmarkCRC64
BenchmarkCRC64-19                6771878               176.4 ns/op
BenchmarkMurmur3_32
BenchmarkMurmur3_32-19           6703288               161.6 ns/op
BenchmarkMurmur3_128
BenchmarkMurmur3_128-19          7424919               165.5 ns/op

Len(Key) = 100

goos: windows
goarch: amd64
pkg: hash_compare
cpu: 12th Gen Intel(R) Core(TM) i7-12700K
BenchmarkMD5
BenchmarkMD5-19                  4070643               295.8 ns/op
BenchmarkSHA1
BenchmarkSHA1-19                 3737098               315.4 ns/op
BenchmarkSHA256
BenchmarkSHA256-19               4678782               259.2 ns/op
BenchmarkSHA512
BenchmarkSHA512-19               3292449               365.5 ns/op
BenchmarkSHA3_256
BenchmarkSHA3_256-19             1956735               619.0 ns/op
BenchmarkSHA3_512
BenchmarkSHA3_512-19             1368730               904.4 ns/op
BenchmarkCRC32
BenchmarkCRC32-19                5888480               199.0 ns/op
BenchmarkCRC64
BenchmarkCRC64-19                6796117               179.5 ns/op
BenchmarkMurmur3_32
BenchmarkMurmur3_32-19           5414822               224.4 ns/op
BenchmarkMurmur3_128
BenchmarkMurmur3_128-19          5682339               217.3 ns/op

Len(Key) = 1000

goos: windows
goarch: amd64
pkg: hash_compare
cpu: 12th Gen Intel(R) Core(TM) i7-12700K
BenchmarkMD5
BenchmarkMD5-19                   534554              2200 ns/op
BenchmarkSHA1
BenchmarkSHA1-19                  623023              1999 ns/op
BenchmarkSHA256
BenchmarkSHA256-19                747392              1586 ns/op
BenchmarkSHA512
BenchmarkSHA512-19                551026              2339 ns/op
BenchmarkSHA3_256
BenchmarkSHA3_256-19              373495              3334 ns/op
BenchmarkSHA3_512
BenchmarkSHA3_512-19              254478              4723 ns/op
BenchmarkCRC32
BenchmarkCRC32-19                1000000              1187 ns/op
BenchmarkCRC64
BenchmarkCRC64-19                 959308              1367 ns/op
BenchmarkMurmur3_32
BenchmarkMurmur3_32-19            839200              1434 ns/op
BenchmarkMurmur3_128
BenchmarkMurmur3_128-19          1000000              1233 ns/op

Len(Key) = 10000

goos: windows
goarch: amd64
pkg: hash_compare
cpu: 12th Gen Intel(R) Core(TM) i7-12700K
BenchmarkMD5
BenchmarkMD5-19                    57900             20013 ns/op
BenchmarkSHA1
BenchmarkSHA1-19                   66994             18038 ns/op
BenchmarkSHA256
BenchmarkSHA256-19                 79039             15403 ns/op
BenchmarkSHA512
BenchmarkSHA512-19                 55267             22265 ns/op
BenchmarkSHA3_256
BenchmarkSHA3_256-19               37862             29851 ns/op
BenchmarkSHA3_512
BenchmarkSHA3_512-19               26913             52982 ns/op
BenchmarkCRC32
BenchmarkCRC32-19                  80836             15127 ns/op
BenchmarkCRC64
BenchmarkCRC64-19                  66034             17882 ns/op
BenchmarkMurmur3_32
BenchmarkMurmur3_32-19             65836             17436 ns/op
BenchmarkMurmur3_128
BenchmarkMurmur3_128-19           105553             13862 ns/op

测试脚本

Hash Func

package hash_compare

import (
	"crypto/md5"
	"crypto/sha1"
	"crypto/sha256"
	"crypto/sha512"
	"hash/crc32"
	"hash/crc64"

	"github.com/twmb/murmur3"
	"golang.org/x/crypto/sha3"
)

func MD5(hash string) string {
	h := md5.New()
	h.Write([]byte(hash))
	return string(h.Sum(nil))
}

func SHA1(hash string) string {
	h := sha1.New()
	h.Write([]byte(hash))
	return string(h.Sum(nil))
}

func SHA256(hash string) string {
	h := sha256.New()
	h.Write([]byte(hash))
	return string(h.Sum(nil))
}

func SHA512(hash string) string {
	h := sha512.New()
	h.Write([]byte(hash))
	return string(h.Sum(nil))
}

func SHA3_256(hash string) string {
	sha3.New256()
	h := sha3.New256()
	h.Write([]byte(hash))
	return string(h.Sum(nil))
}

func SHA3_512(hash string) string {
	h := sha3.New512()
	h.Write([]byte(hash))
	return string(h.Sum(nil))
}

func Murmur3_32(hash string) string {
	h := murmur3.New32()
	_, _ = h.Write([]byte(hash))
	return string(h.Sum(nil))
}

func Murmur3_128(hash string) string {
	h := murmur3.New128()
	_, _ = h.Write([]byte(hash))
	return string(h.Sum(nil))
}
func CRC32(hash string) string {
	h := crc32.New(crc32.IEEETable)
	_, _ = h.Write([]byte(hash))
	return string(h.Sum(nil))
}

func CRC64(hash string) string {
	h := crc64.New(crc64.MakeTable(crc64.ISO))
	_, _ = h.Write([]byte(hash))
	return string(h.Sum(nil))
}

Bench Script

package hash_compare

import "testing"

var length = 10000

func randomString(length int) string {
	const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
	b := make([]byte, length)
	for i := range b {
		b[i] = charset[i%len(charset)]
	}
	return string(b)
}

func BenchmarkMD5(b *testing.B) {
	for i := 0; i < b.N; i++ {
		MD5(randomString(length))
	}
}

func BenchmarkSHA1(b *testing.B) {
	for i := 0; i < b.N; i++ {
		SHA1(randomString(length))
	}
}

func BenchmarkSHA256(b *testing.B) {
	for i := 0; i < b.N; i++ {
		SHA256(randomString(length))
	}
}

func BenchmarkSHA512(b *testing.B) {
	for i := 0; i < b.N; i++ {
		SHA512(randomString(length))
	}
}

func BenchmarkSHA3_256(b *testing.B) {
	for i := 0; i < b.N; i++ {
		SHA3_256(randomString(length))
	}
}

func BenchmarkSHA3_512(b *testing.B) {
	for i := 0; i < b.N; i++ {
		SHA3_512(randomString(length))
	}
}

func BenchmarkCRC32(b *testing.B) {
	for i := 0; i < b.N; i++ {
		CRC32(randomString(length))
	}
}

func BenchmarkCRC64(b *testing.B) {
	for i := 0; i < b.N; i++ {
		CRC64(randomString(length))
	}
}

func BenchmarkMurmur3_32(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Murmur3_32(randomString(length))
	}
}

func BenchmarkMurmur3_128(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Murmur3_128(randomString(length))
	}
}

标签:BenchmarkMurmur3,常用,Hash,函数,19,hash,ns,string,op
From: https://www.cnblogs.com/pDJJq/p/18111313/common-hat-function-speed-comparison-1bruzn

相关文章

  • 构造函数init到底是什么作用 是下面的方法都可以从init里面获取参数吗?(AI+Python)
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【无敌劈叉小狗】问了一个Python基础的问题,问题如下:问一下构造函数init到底是什么作用是下面的方法都可以从init里面获取参数吗?二、实现过程这里【黄志诚】分享了自己的一个经验:全局呀,相当于初始化一个参数,全局都......
  • Thread 类使用及常用操作
    Thread类是JVM用来管理线程的一个类,换句话说,每个线程都有一个唯一的Thread对象与之关联。每个执行流,也需要有一个对象来描述,类似下图所示,而Thread类的对象就是用来描述一个线程执行流的,JVM会将这些Thread对象组织起来,用于线程调度,线程管理。1Thread的常见构造方......
  • 【C语言】函数(涉及生命周期与作用域)
    文章目录函数(function)**函数的概念****函数的作用**在本阶段一般会涉及到两类函数:库函数和自定义函数自定义函数**函数的语法形式****形参和实参****实参和形参的关系**函数返回值**函数返回值类型说明****return语句**数组做函数参数**函数嵌套调用和链式访问**函......
  • Git常用命令大全:让你轻松驾驭版本控制
    前言Git是一款强大的分布式版本控制系统,广泛应用于软件开发中。无论是个人开发者还是团队协作,掌握Git的常用命令是至关重要的。本文将介绍Git的常用命令,帮助您更好地管理代码版本。初始化一个新的仓库gitinit这个命令将在当前目录下创建一个新的Git仓库。克隆一个仓库......
  • 类的函数成员(三):拷贝构造函数
    一.什么是拷贝构造函数?1.1概念        同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。        在建立对象时可用同一类的另一个对象来初始化该对......
  • JS- 构造函数调用与常规函数和方法调用的主要区别
    构造函数调用与常规函数和方法调用的主要区别:特征构造函数调用常规函数和方法调用调用方式使用new关键字直接调用函数名或通过对象调用方法参数处理构造函数可以接受任意数量和类型的参数,并且通过this来引用它们函数和方法可以接受任意数量和类型的参数this的值新创建......
  • 22_shell脚本条件判断、函数和循环
    shell脚本条件判断、函数和循环一、shell脚本条件判断​shell脚本支持条件判断,虽然可以通过&&和||来实现简单的条件判断,但是稍微复杂一点的场景就不适合了。shell脚本提供了ifthen条件判断语句,写法if条件判断;then//判断成立要做的事情fi还有ifthenelse语句,写法......
  • 生信小白菜之关于mutate函数的一切
    RforDataScience准备包和示例数据library(dplyr)library(nycflights13)mutate()函数基本用法#作用是添加新列,新列是由原有数据计算的来#添加的新列在数据集的最后#举例flights_sml<-select(flights,year:day,ends_with("delay"),distance,air_time)mu......
  • 生信小白菜之关于summarize函数的一切(part 1)
    准备包和示例数据library(dplyr)library(nycflights13)library(ggplot2)summarize()的基本用法#获取摘要的函数#作用是将数据框折叠成一行#举例summarise(flights,delay=mean(dep_delay,na.rm=T))#第二个参数新的一列,也是根据数据框原有数据计算得来#返回结......
  • R语言layout函数处理可视化图像布局实战
     R语言layout函数处理可视化图像布局实战目录R语言layout函数处理可视化图像布局实战#基本语法#layout定义位置矩阵并可视化......