gpt4 book ai didi

java - 需要 Java 中的线程安全 MessageDigest

转载 作者:IT老高 更新时间:2023-10-28 20:32:24 24 4
gpt4 key购买 nike

我需要在性能关键的环境中使用 MessageDigest 对来自多个线程的多个键进行哈希处理。我开始知道 MessageDigest 不是线程安全的,因为它将状态存储在它的对象中。实现键的线程安全散列的最佳方法是什么?

用例:

MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");

//somewhere later, just need to hash a key, nothing else
messageDigest.update(key);
byte[] bytes = messageDigest.digest();

具体来说:

  1. ThreadLocal 能保证工作吗?会不会有表现惩罚?
  2. getInstance 返回的对象是否不同?不互相干扰?文档说"new"对象,但我不确定它是否只是(共享)的包装器共享具体类?
  3. 如果 getInstance() 返回“真正的”新对象,每次我需要创建一个新实例是否可取计算哈希?就性能损失而言——代价是多大是吗?

我的用例非常简单——只需散列一个简单的键。我负担不起使用同步。

谢谢,

最佳答案

每次需要时创建一个新的MessageDigest实例。

getInstance() 返回的所有实例都是不同的。它们必须是,因为它们维护单独的摘要(如果这对您来说还不够,here's 一个指向源的链接)。

ThreadLocal 可以在与线程池一起使用时提供性能优势,以维护昂贵的构造对象。 MessageDigest 构造起来并不特别昂贵(再次查看源代码)。

关于java - 需要 Java 中的线程安全 MessageDigest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17554998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com