我需要在多线程环境下使用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返回的对象是不同的,它们互不干扰吗?文档中说“new”对象,但我不确定它是否只是(共享的)共享具体类的包装器?
- 如果getInstance()返回“真正”的新对象,每次需要计算哈希时都创建一个新实例是否明智?在性能损失方面——代价有多大?
我的用例非常简单——只需要哈希一个简单的键。我无法承担使用同步。
谢谢,
ThreadLocal
。这是过早的优化。我编写了一个微型基准测试,需要约2 微秒来创建一个新的MessageDigest
。这个时间在使用摘要的代码中将被远远超过。 - parsifalThreadLocal
很满意,而且我不太可能改变你的看法。所以做让你开心的事情吧。 - parsifaljava.security.Provider.getService
方法是同步的并且似乎是单例的,因此可能会出现显著的性能问题。 - Martin Serrano