如何在java中更快地计算sha256?

2024-02-14

我发现在java中计算sha256很慢。例如,它比python慢​​。我编写了两个简单的基准测试来计算 1GB 零的 sha256。在这两种情况下,结果是相同且正确的,但 python 时间为 5653ms,java 时间为 8623ms(慢了 53%)。每次的结果都是相似的,这对我来说是一个重要的区别。

如何让java中的计算速度更快?

基准:

Java:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class BenchmarkSha256 {

  public static void main(String... args) throws NoSuchAlgorithmException {
    int size = 1024 * 1024;
    byte[] bytes = new byte[size];
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    long startTime = System.nanoTime();
    for (int i = 0; i < 1024; i++)
      md.update(bytes, 0, size);
    long endTime = System.nanoTime();
    System.out.println(String.format("%1$064x", new java.math.BigInteger(1, md.digest())));
    System.out.println(String.format("%d ms", (endTime - startTime) / 1000000));
  }

}

Python:

#!/usr/bin/env python

import hashlib
import time

size = 1024 * 1024
bytes = bytearray(size)
md = hashlib.sha256()
startTime = time.time()
for i in range(0, 1024):
  md.update(bytes)
endTime = time.time()
print "%s\n%d ms" % (md.hexdigest(), (endTime - startTime) * 1000)

results:

~> java BenchmarkSha256
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14
8623 ms

~> python BenchmarkSha256.py 
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14
5653 ms

java 和 python 的版本:

~> java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

~> python --version
Python 2.7

我对以下 SHA-256 实现进行了测试:Java 内置、Groovy 内置、Apache Commons、Guava 和 Bouncy Castle。我的一次运行结果如下:

>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

这是在 Intel i5 第 8 代上运行的。Apache 和 Guava 很容易成为两个最快的实现。在我的跑步中有 9/10,Apache Commons 以微弱优势击败了 Guava。我的此测试代码可用here https://gist.github.com/scoroberts/a60d61a2cc3afba1e8813b338ecd1501.

请注意,在运行此测试后,我开始想知道是否可以通过利用 CPU 指令集(Intel 有SHA 扩展 https://en.wikipedia.org/wiki/Intel_SHA_extensions)。我不确定是否有一种 JVM 方法可以在没有 JNI 或 JNA 的情况下执行此操作。我创建了另一个问题here https://stackoverflow.com/q/58404400/311525.

Update:我发现的另一个选择是Amazon Corretto 加密提供商 (ACCP) https://aws.amazon.com/blogs/opensource/introducing-amazon-corretto-crypto-provider-accp/。可用代码here https://github.com/corretto/amazon-corretto-crypto-provider.

ACCP到底是什么?

ACCP 实现了标准 Java 加密架构 (JCA) 接口,并用 OpenSSL 项目中的 libcrypto 提供的实现替换了默认的 Java 加密实现。 ACCP 允许您充分利用汇编级和 CPU 级性能调整,从而在多个服务和产品中显着降低成本、减少延迟并提高吞吐量,如下面的示例所示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在java中更快地计算sha256? 的相关文章

随机推荐

  • 在 iOS 上通过 上传存储在云服务上的文件 0 字节

    我无法弄清楚为什么某些从 iOS 上传到我们服务器的内容会导致空文件 上传页面是一个简单的表单 使用 POST 和 enctype 作为 multipart form data 该问题似乎仅在用户执行以下操作时才会出现 正在使用 iOS 尝
  • 已分析与未分析:存储大小

    我最近开始使用 ElasticSearch 2 据我了解analyzed vs 未分析在映射中 not analyzed 在存储中应该更好 https www elastic co blog elasticsearch storage th
  • 在Android上加载依赖的共享库

    我正在移植大量本机代码和几个相互依赖的库 加载代码失败 因为 Android 链接器仅查找依赖项 system lib 并且不在应用程序安装目录中 data data com packagename nnn lib 作为第一个解决方法 我使
  • Chrome 显示 Lottie 动画模糊

    我遇到了缩放 Lottie 动画的问题 Chrome 模糊了动画 当动画缩放时 这一点尤其明显 在我的示例中 原始动画的尺寸为 842x596px 渲染效果越小 效果越差 如果您想在 Chrome 浏览器中重现它 这里是示例代码 lotti
  • 为带有条件编译的产品实现工厂模式

    我想以一种允许我在不引入类型依赖的情况下编译代码的方式实现工厂 或其他模式 enum CarType BMW PORSCHE MERC class CarFactory public static Car create CarType ty
  • 在 Google 电子表格中复制/粘贴数据验证

    我觉得自己有点傻 无法弄清楚这一点 这是我设置的数据验证 单元格范围 Journal J2 标准 从范围中列出 Journal W2 X2 细胞范围 Journal M2 标准 从范围中列出 Journal Y2 AA2 这在我的第一排很棒
  • SwiftUI Preview 不适用于 FetchRequest 和 Init

    我遇到了 SwiftUI Preview 有时无法工作的问题 但没有给我任何错误 只是一个空白的画布 我已经缩小了问题范围 当我将 fetchRequest 与 init 一起使用时它不起作用 但我不知道下一步该做什么 预览适用于以下代码
  • HTML 5 在 Firefox 上的性能?

    我在这里尝试了这个示例 http 9elements com io projects html5 canvas http 9elements com io projects html5 canvas 几分钟后 Firefox 速度变慢 我什
  • 从核心文件恢复程序状态

    在任何情况下 是否有可能将程序的状态恢复到生成核心文件期间的状态 我问的原因是 为了利用 gdb 执行函数等的能力 您需要有一个正在运行的实例 当然应该可以生成同一可执行文件的模拟进程 并将状态设置为核心的内容 如果不是 对于最初让我想要这
  • 启动没有 Activity 的 Android 应用程序

    我有一个旨在仅作为服务运行的应用程序 没有界面 仅在后台运行 我的 AndroidManifest xml 中没有提到任何活动 但放置了一个接收器以在手机启动时启动应用程序
  • 如何从 kubernetes 中的 dockerhub 拉取镜像?

    我计划在我的 kubernetes 集群基础设施中部署一个应用程序 我将图像推送到 dockerhub 存储库 如何从 dockerhub 拉取镜像 一行命令创建 Docker 注册表机密 kubectl create secret doc
  • 如何在c中调用的matlab函数中使用“全局静态”变量

    您好 我目前正在使用 MATLAB 和 C 进行编码 我已使用以下命令将 MATLAB 函数编译到 C 共享库中 MATLAB编译器 http www mathworks com help compiler shared libraries
  • 在 Matplotlib 中使用注释将文本框放置在图例下方

    我希望使用 annotate 在 Matplotlib 图中显示一些文本 并在图例框下方对齐 我已经检查了中提出的解决方案如何在 matplotlib 中将文本框直接放置在图例下方 https stackoverflow com quest
  • 让 Spring Boot 创建测试数据库

    如何让 Spring Boot 在测试类之间从头开始重新创建内存中的测试数据库 我有几个本地集成测试 注释为 SpringApplicationConfiguration and WebIntegrationTest改变数据库状态 我已将其
  • SimpleXML 解析元素列表异常

    您好 我在解析此 xml 时遇到问题
  • vuejs 中加载更多按钮

    我从 php 收到一个包含客户评论的数组 var comment list new Vue el comment list data testimonials JSON parse addslashes json encode array
  • 在服务器上运行 R 时,如何从 emacs ess 启动 x-window?

    我按照 ess 手册中的说明将 emacs snapshot 与 ssh el 包一起使用 有几种方法可以打开 R 会话 但我是这样做的 打开 emacs C x C f server dir file R 这使我进入 ESS S 模式 输
  • Python Gui 编程和 CPU 使用。如何创建“空闲”或“节流”,以便一段代码不会消耗 100 个可用 CPU?

    当一个朋友正在测试我制作的 GUI 时 我收到了关于运行缓慢的投诉 果然 查看 Xp 的性能监视器 它完全开放地运行 消耗了尽可能多的 cpu 经过对 stackoverflow 的一些挖掘 这似乎是正常的预期行为 我的问题是 有没有办法限
  • 如何在os.system中使用python变量? [复制]

    这个问题在这里已经有答案了 我正在用Python创建小型控制台脚本 我想在其中放入cowsay命令 但是cow说变量的名称 字符串所在的位置 而不是变量内的字符串 我怎样才能让牛说出变量中的字符串 if command cow word r
  • 如何在java中更快地计算sha256?

    我发现在java中计算sha256很慢 例如 它比python慢 我编写了两个简单的基准测试来计算 1GB 零的 sha256 在这两种情况下 结果是相同且正确的 但 python 时间为 5653ms java 时间为 8623ms 慢了