繁体   English   中英

SHA-256 编码 Java(在 Intel CPU 上)中的许多短字符串值的最快方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM