Мне нужно хэшировать несколько ключей из нескольких потоков, используя MessageDigest в критичной для производительности среде. Я узнал, что MessageDigest не является потокобезопасным, поскольку он сохраняет свое состояние в своем объекте. Каким может быть наилучший способ достижения потокового безопасного хеширования ключей?Нужна потоковая безопасность MessageDigest в Java
использования:
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() возвращает «реальные» новые объекты, целесообразно создать новый экземпляр каждый раз, когда мне нужно, чтобы вычислить хэш? С точки зрения эффективности - как дорого стоит ?
My use case очень прост - просто хэш простой ключ. Я не могу позволить использовать синхронизацию.
Спасибо,
Если я вижу codeof GetInstance(), это не похоже, чтобы создать новый объект, а это требует безопасность, чтобы получить объект Object [] OBJS = Security.getImpl Я написал тестовый пример ниже: \t MessageDigest messageDigest1 = MessageDigest.getInstance ("SHA-1"); \t MessageDigest messageDigest2 = MessageDigest.getInstance ("SHA-1"); // обновить и переварить и увидеть, что оба объекта messageDigest различны, а также их внутренние объекты/буферы также различны. Итак, я думаю, что ThreadLocal должен работать. И да, это веб-сервер с пулом потоков. Я буду использовать ThreadLocal. Спасибо, –
@AnilPadia - я ** сильно ** рекомендую ** не ** используя 'ThreadLocal'. Это преждевременная оптимизация. Я написал микро-бенчмарк, который потребовал приблизительно 2 * микро * -секунды для создания нового 'MessageDigest'. Это будет * далеко * перевешиваться кодом, который использует дайджест. – parsifal
Какие проблемы вы видите при использовании ThreadLocal. Даже если у меня есть сотни потоков, там будут сотни таких объектов. Я обнаружил, что объем памяти таких объектов меньше. ThreadLocal отлично работает для меня. Я также тестировал создание объектов, и потребовалось 4 микросекунды. Мне бы очень хотелось знать, почему против ThreadLocal –