需要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使用时, ThreadLocal 可以提供性能优势,以维护昂贵的构造对象。 构建MessageDigest并不是特别昂贵(再次查看源代码)。

作为替代方案,使用DigestUtils ,Apache Commons的MessageDigest线程安全包装器。

sha1()做你需要的:

byte[] bytes = sha1(key)

DigestUtils似乎不再是原始MessageDigest线程安全。 仍然使用MessageDigest.getInstance。