messagedigest example java performance message-digest

messagedigest java example



Necesita hilo seguro MessageDigest en Java (3)

Como alternativa, use DigestUtils , el envoltorio seguro de subprocesos de Apache Commons para MessageDigest.

sha1() hace lo que necesitas:

byte[] bytes = sha1(key)

Necesito codificar varias claves de varios subprocesos utilizando MessageDigest en un entorno de rendimiento crítico. Llegué a saber que MessageDigest no es seguro para subprocesos ya que almacena su estado en su objeto. ¿Cuál puede ser la mejor manera posible de lograr un hashing de claves seguro para subprocesos?

Caso de uso:

MessageDigest messageDigest = MessageDigest.getInstance("SHA-1"); //somewhere later, just need to hash a key, nothing else messageDigest.update(key); byte[] bytes = messageDigest.digest();

Específicamente:

  1. ¿Se garantiza que ThreadLocal funcione? ¿Tendrá penalización de rendimiento?
  2. ¿Los objetos devueltos por getInstance son diferentes y no interfieren entre sí? La documentación dice "nuevo" objeto, pero no estoy seguro de si es solo un contenedor en una clase concreta compartida (compartida)?
  3. Si getInstance () devuelve objetos ''reales'', ¿es recomendable crear una nueva instancia cada vez que necesito calcular el hash? En términos de penalización de desempeño, ¿qué tan costoso es?

Mi caso de uso es muy simple, solo tiene una clave simple. No puedo permitirme usar la sincronización.

Gracias,


Cree una nueva instancia de MessageDigest cada vez que necesite una.

Todas las instancias devueltas desde getInstance() son distintas. Deben serlo, ya que mantienen resúmenes separados (y si eso no es suficiente para usted, here''s un enlace a la fuente).

ThreadLocal puede proporcionar un beneficio de rendimiento cuando se utiliza con un conjunto de subprocesos, para mantener objetos caros de construir. MessageDigest no es particularmente costoso de construir (nuevamente, mire la fuente).


DigestUtils no parece ser más seguro para subprocesos que MessageDigest en bruto. Todavía usa MessageDigest.getInstance debajo de las portadas.