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