[英]What is the fastest way to SHA-256 encode many short String values in Java (on an Intel CPU)?
这个问题与这两个问题略有相关,但有这两个区别:1)我想知道如何从 JVM(希望通过现有库)挂钩特定的英特尔指令 2)我不关心一个大文件,但是数百万个短(< 50 个字符)字符串和数字对象。
我注意到英特尔提供了用于创建 SHA256 哈希的本机扩展( https://software.intel.com/en-us/articles/intel-sha-extensions )。 Java 中是否有任何现有的库可以挂钩这些本机扩展? 是否有本地挂钩这些扩展的 JVM 实现?
我应该为单个巨型文件中的数百万个小字符串和数字值选择不同的实现吗?
作为测试,我尝试了 5 种不同的哈希算法:内置 Java、内置 Groovy、Apache Commons、Guava 和 Bouncy Castle。 只有 Apache 和 Guava 在我的 Intel i5 硬件上似乎超过了 100 万次哈希/秒。
>groovy hash_comp.groovy
Hashing 1000000 iterations of SHA-256
time java: 2968 336927.2237196765 hashes/sec
time groovy: 2451 407996.7360261118 hashes/sec
time apache: 1025 975609.7560975610 hashes/sec
time guava: 901 1109877.9134295228 hashes/sec
time bouncy: 1969 507872.0162519045 hashes/sec
>groovy hash_comp.groovy
Hashing 1000000 iterations of SHA-256
time java: 2688 372023.8095238095 hashes/sec
time groovy: 1948 513347.0225872690 hashes/sec
time apache: 867 1153402.5374855825 hashes/sec
time guava: 953 1049317.9433368311 hashes/sec
time bouncy: 1890 529100.5291005291 hashes/sec
当我连续运行 10 次时,Apache Commons 散列在散列 100 万个字符串时始终是赢家(它赢了 9/10 次)。 我的测试代码在这里可用。
问题仍然存在,有没有办法利用 JVM 中的英特尔 SHA 哈希扩展?
更新
正如@MJM 在评论中所建议的那样,我已经删除了 String 函数并纯粹在 byte[] 到 byte[] 上进行了测试。 以下是示例结果:
Hashing 1000000 iterations of SHA-256
time java: 674 1483679.5252225519 hashes/sec
time apache: 833 1200480.1920768307 hashes/sec
time guava: 705 1418439.7163120567 hashes/sec
time bouncy: 692 1445086.7052023121 hashes/sec
我发现使用本机加密功能变得简单的最快解决方案是 Amazon Corretto Crypto Provider (ACCP)。
https://aws.amazon.com/blogs/opensource/introducing-amazon-corretto-crypto-provider-accp/
https://github.com/corretto/amazon-corretto-crypto-provider
来自亚马逊:
ACCP究竟是什么?
ACCP 实现了标准的 Java 加密体系结构 (JCA) 接口,并将默认的 Java 加密实现替换为 OpenSSL 项目中的 libcrypto 提供的实现。 ACCP 允许您充分利用程序集级别和 CPU 级别的性能调整,以显着降低成本、减少延迟并提高跨多个服务和产品的吞吐量,如下面的示例所示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.