I need to hash multiple keys from multiple threads using MessageDigest in a performance critical environment. I came to know that MessageDigest is not thread safe as it stores its state in it’s object. What can be the best possible way to achieve thread safe hashing of keys?
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1"); //somewhere later, just need to hash a key, nothing else messageDigest.update(key); byte bytes = messageDigest.digest();
- Will ThreadLocal guaranteed to work? Will it have performance
- Are the objects returned by getInstance different and they
do not interfere with each other? The documentation says ‘new’
object, but I am not sure whether it is just a wrapper on (shared)
shared concrete class?
- If getInstance() returns ‘real’ new objects,
is it advisable to create a new instance each time I need to
calculate the hash? In terms of performance penalty – how costly is
My use case is very simple – just hash a simple key. I cannot afford to use synchronization.
Create a new
MessageDigest instance each time you need one.
All of the instances returned from
getInstance() are distinct. They need to be, as they maintain separate digests (and if that’s not enough for you, here’s a link to the source).
ThreadLocal can provide a performance benefit when used with a threadpool, to maintain expensive-to-construct objects.
MessageDigest isn’t particularly expensive to construct (again, look at the source).
Answered By – parsifal
Answer Checked By – Katrina (BugsFixing Volunteer)