我需要在性能关键的环境中使用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();
特别:
罚款?
不互相干扰?文档说"new"
对象,但是我不确定它是否只是(共享)上的包装器
共享的具体类(class)?
是否建议每次需要创建一个新实例时
计算哈希?就性能损失而言-成本有多高
它?
我的用例非常简单-只需哈希一个简单的键即可。我无法使用同步。
谢谢,
最佳答案
每次需要时创建一个新的MessageDigest
实例。
从getInstance()
返回的所有实例都是不同的。它们必须是这样,因为它们维护着单独的摘要(如果这对您来说还不够,请here's链接到源)。
与线程池一起使用时,ThreadLocal
可以提供性能优势,以维护昂贵的构造对象。 MessageDigest
的构建并不是特别昂贵(再次,请参见源代码)。