在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();
特别:
- ThreadLocal是否可以保证正常工作?它会有性能损失吗?
- getInstance返回的对象是否不同,并且它们不会互相干扰?文档说“新”对象,但是我不确定它是否只是(共享)共享具体类的包装?
- 如果getInstance()返回“真实”新对象,是否建议每次我需要计算散列时都创建一个新实例?就性能损失而言-它的成本是多少?
我的用例非常简单-只需哈希一个简单的键即可。我无法使用同步。
谢谢,
回答:
MessageDigest
每次需要时创建一个新实例。
从中返回的所有实例getInstance()
都是不同的。它们必须是独立的摘要,因为它们维护着单独的摘要(如果这对您来说还不够用,请在此处找到源链接)。
ThreadLocal
__与线程池一起使用时, 可以
提供性能优势,以维护昂贵的构造对象。MessageDigest
构造起来并不是特别昂贵(再次查看源代码)。
以上是 在Java中需要线程安全的MessageDigest 的全部内容, 来源链接: utcz.com/qa/424023.html