minio/highwayhash
GitHub: minio/highwayhash
HighwayHash 的 Go 原生实现,通过多架构汇编优化提供极高吞吐量的伪随机哈希计算,适用于防泛洪、消息认证和指纹识别等非加密哈希场景。
Stars: 955 | Forks: 82
[](https://godoc.org/github.com/minio/highwayhash)
[](https://travis-ci.org/minio/highwayhash)
## HighwayHash
[HighwayHash](https://github.com/google/highwayhash) 是一种由 Jyrki Alakuijala、Bill Cox 和 Jan Wassenberg(Google 研究)开发的伪随机函数(PRF)。HighwayHash 接收一个 256 位的密钥,并计算给定消息的 64、128 或 256 位哈希值。
它可用于防止哈希泛洪攻击或验证短期消息。此外,它还可以用作指纹识别函数。HighwayHash 不是通用的加密哈希函数(如 Blake2b、SHA-3 或 SHA-2),如果需要强抗碰撞性,则不应使用它。
此存储库包含原生 Go 版本以及针对 Intel、ARM 和 ppc64le 架构的优化汇编实现。
### 高性能
HighwayHash 是一种速度大约快 5 倍的 SIMD 哈希函数,与之相比的 [SipHash](https://www.131002.net/siphash/siphash.pdf) 本身也是一种由 Aumasson 和 Bernstein 设计的快速且“加密强度高”的伪随机函数。
HighwayHash 使用一种新方法,通过 AVX2 乘法和置换指令来混合输入。乘法是 32x32 位并产生 64 位宽的结果,因此不可逆转。此外,置换使结果字节的分布均匀化。该算法输出从 64 位到 256 位的摘要,且无需额外成本。
### 稳定性
截至 2018 年 1 月,HighwayHash 的所有三种输出大小均已宣布 [稳定](https://github.com/google/highwayhash/#versioning-and-stability)。这意味着对于任何给定的输入消息,其哈希结果都保证不会改变。
### 安装
安装:`go get -u github.com/minio/highwayhash`
### Intel 性能
以下是在 Intel Core i7 (3.1 GHz) 上生成 256 位输出的单核结果:
```
BenchmarkSum256_16 204.17 MB/s
BenchmarkSum256_64 1040.63 MB/s
BenchmarkSum256_1K 8653.30 MB/s
BenchmarkSum256_8K 13476.07 MB/s
BenchmarkSum256_1M 14928.71 MB/s
BenchmarkSum256_5M 14180.04 MB/s
BenchmarkSum256_10M 12458.65 MB/s
BenchmarkSum256_25M 11927.25 MB/s
```
因此,对于中等大小的消息,其最高速度约为 15 GB/秒。此外,对于小消息 (1K),性能已经达到最大吞吐量的 60% 左右。
### ARM 性能
以下是在 EC2 c7g.4xlarge (Graviton3) 实例上生成 256 位输出的单核结果:
```
BenchmarkSum256_16 143.66 MB/s
BenchmarkSum256_64 628.75 MB/s
BenchmarkSum256_1K 3621.71 MB/s
BenchmarkSum256_8K 5039.64 MB/s
BenchmarkSum256_1M 5279.79 MB/s
BenchmarkSum256_5M 5474.60 MB/s
BenchmarkSum256_10M 5621.73 MB/s
BenchmarkSum256_25M 5250.47 MB/s
```
### ppc64le 性能
与非优化版本相比,ppc64le 加速版本大约快 10 倍:
```
benchmark old MB/s new MB/s speedup
BenchmarkWrite_8K 531.19 5566.41 10.48x
BenchmarkSum64_8K 518.86 4971.88 9.58x
BenchmarkSum256_8K 502.45 4474.20 8.90x
```
### 与其他哈希技术的性能比较
在 Skylake CPU(3.0 GHz Xeon Platinum 8124M)上,下表显示了对于 5 MB 消息,HighwayHash 与其他哈希技术的比较(单核性能,均为 Golang 实现,参见 [基准测试](https://github.com/fwessels/HashCompare/blob/master/benchmarks_test.go))。
```
BenchmarkHighwayHash 11986.98 MB/s
BenchmarkSHA256_AVX512 3552.74 MB/s
BenchmarkBlake2b 972.38 MB/s
BenchmarkSHA1 950.64 MB/s
BenchmarkMD5 684.18 MB/s
BenchmarkSHA512 562.04 MB/s
BenchmarkSHA256 383.07 MB/s
```
*注意:SHA256 的 AVX512 版本使用了由 Intel 开发的 [多缓冲加密库](https://github.com/intel/intel-ipsec-mb) 技术,更多详细信息可以在 [sha256-simd](https://github.com/minio/sha256-simd/) 中找到。*
### 定性评估
我们已经针对不同数量的消息,对 HighwayHash 和 Blake2b 在校验和分布方面的表现进行了“定性”评估。如下图所示,HighwayHash 的表现与之相似:

更多信息可以在 [HashCompare](https://github.com/fwessels/HashCompare) 中找到。
### 要求
支持所有 >= 1.11 的 Go 版本(因为不同平台所需的汇编支持需要它)。
### 贡献
欢迎贡献,请发送 PR 以进行任何增强。
标签:EVTX分析, Go, HighwayHash, Ruby工具, SIMD, 哈希算法, 密码学, 手动系统调用, 日志审计, 自动回退