我需要在性能关键的环境中使用 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() 返回“真实”新对象,是否建议每次需要计算哈希时都创建一个新实例?在性能损失方面 - 它的成本是多少?
我的用例非常简单——只需散列一个简单的键。我负担不起使用同步。
谢谢,