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

用例:

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

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

特别:
  • ThreadLocal是否可以保证正常工作?有表现吗
    罚款?
  • getInstance返回的对象是否不同,并且它们
    不互相干扰?文档说"new"
    对象,但是我不确定它是否只是(共享)上的包装器
    共享的具体类(class)?
  • 如果getInstance()返回“真实”新对象,
    是否建议每次需要创建一个新实例时
    计算哈希?就性能损失而言-成本有多高
    它?

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

    谢谢,

    最佳答案

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

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

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

    10-06 05:12