minio/highwayhash

GitHub: minio/highwayhash

HighwayHash 的 Go 原生实现,通过多架构汇编优化提供极高吞吐量的伪随机哈希计算,适用于防泛洪、消息认证和指纹识别等非加密哈希场景。

Stars: 955 | Forks: 82

[![Godoc 参考文档](https://godoc.org/github.com/minio/highwayhash?status.svg)](https://godoc.org/github.com/minio/highwayhash) [![构建状态](https://travis-ci.org/minio/highwayhash.svg?branch=master)](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 的表现与之相似: ![哈希比较概览](https://s3.amazonaws.com/s3git-assets/hash-comparison-final.png) 更多信息可以在 [HashCompare](https://github.com/fwessels/HashCompare) 中找到。 ### 要求 支持所有 >= 1.11 的 Go 版本(因为不同平台所需的汇编支持需要它)。 ### 贡献 欢迎贡献,请发送 PR 以进行任何增强。
标签:EVTX分析, Go, HighwayHash, Ruby工具, SIMD, 哈希算法, 密码学, 手动系统调用, 日志审计, 自动回退