Мне нужно хэшировать несколько ключей из нескольких потоков, используя 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() возвращает "реальные" новые объекты, целесообразно создавать новый экземпляр каждый раз, когда мне нужно рассчитать хэш? Что касается штрафа за производительность - насколько дорого это?
Мой пример использования очень прост - просто хэш - простой ключ. Я не могу позволить использовать синхронизацию.
Спасибо,