我需要在性能关键的环境中使用 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() 返回“真正的”新对象, 每次我需要创建一个新实例是否可取 计算哈希?就性能损失而言——代价是多大 是吗?
我的用例非常简单——只需散列一个简单的键。我负担不起使用同步。
谢谢,
最佳答案
每次需要时创建一个新的MessageDigest
实例。
从 getInstance()
返回的所有实例都是不同的。它们必须是,因为它们维护单独的摘要(如果这对您来说还不够,here's 一个指向源的链接)。
ThreadLocal
可以在与线程池一起使用时提供性能优势,以维护昂贵的构造对象。 MessageDigest
构造起来并不特别昂贵(再次查看源代码)。
关于java - 需要 Java 中的线程安全 MessageDigest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17554998/