在Java中需要线程安全的MessageDigest

我需要在性能关键的环境中使用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返回的对象是否不同,并且它们不会互相干扰?文档说“新”对象,但是我不确定它是否只是(共享)共享具体类的包装?
  3. 如果getInstance()返回“真实”新对象,是否建议每次我需要计算散列时都创建一个新实例?就性能损失而言-它的成本是多少?

我的用例非常简单-只需哈希一个简单的键即可。我无法使用同步。

谢谢,

回答:

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

从中返回的所有实例getInstance()都是不同的。它们必须是独立的摘要,因为它们维护着单独的摘要(如果这对您来说还不够用,请在此处找到源链接)。

ThreadLocal __与线程池一起使用时, 可以

提供性能优势,以维护昂贵的构造对象。MessageDigest构造起来并不是特别昂贵(再次查看源代码)。

以上是 在Java中需要线程安全的MessageDigest 的全部内容, 来源链接: utcz.com/qa/424023.html

回到顶部