Estoy escribiendo una biblioteca Java que necesita calcular hashes SHA-1. Durante una tarea común, la JVM pasa aproximadamente el 70% de su tiempo en sun.security.provider.SHA.implCompress
, 10% en java.util.zip.Inflater.inflate
y 2% en sun.security.provider.ByteArrayAccess.b2iBig64
. (De acuerdo con el perfilador de NetBeans.)Sugerencias máximas de rendimiento SHA-1 Hash en Java
Parece que no puedo obtener las palabras clave de búsqueda de Google para obtener resultados relevantes. No estoy muy familiarizado con el algoritmo hash SHA-1. ¿Cómo puedo obtener el máximo rendimiento de SHA-1 MessageDigest
? ¿Hay un cierto tamaño de porción que debería digerir, o múltiplos de ciertos tamaños que debería probar?
para responder a algunas preguntas que usted está pensando en preguntar:
- Sí, lo estoy digiriendo al leer los archivos (
MessageDigest.update
), por lo que solamente se digieren bytes de una vez. - Los compendios de SHA-1 se utilizan como sumas de comprobación, generalmente para los archivos que deben estar zlib/inflados.
- No, no puedo usar un hash diferente.
- Sí, sé que zlib ya usa sumas de comprobación, pero los requisitos externos especifican el uso de hashes SHA-1 además de eso. No puedo encontrar una buena razón por la cual (+1 si puede) :-)
Si es IO en su computadora local lo que necesita para hacer este trabajo, sugiero invertir en un disco SSD, ya que sospecho que realmente leer los archivos de HDD es un cuello de botella aquí. –
Ya he hecho todo lo posible para optimizar la E/S. Ya he analizado varias optimizaciones de IO, y el generador de perfiles dice que IO requiere el mismo tiempo que la digestión.Estoy bastante seguro de que no puedo hacer nada mejor con IO –
Java es (era) lento en comparación con C/C++, pero en algunas tareas, es un poco más rápido. Si tiene acceso a una implementación C/C++ de su algoritmo, haga una comparación. Si Java es significativamente más lenta, es probable que haya margen de mejora, pero si son casi iguales, es probable que haya pocas posibilidades de mejora. (Hice una comparación tanto con C como con D cuando tuve un montón de matemáticas para hacer, y resultó que mi versión de Java fue la más rápida). –