Usted es el más correcto. Si su sistema no tiene ningún adversario, el uso de funciones hash criptográficas es excesivo debido a sus propiedades de seguridad.
colisiones dependen del número de bits , b, de su función hash y el número de valores de troceo , N, se estiman de calcular. La literatura académica defiende que esta probabilidad de colisión debe ser inferior a la probabilidad de error de hardware, por lo que es menos probable que se produzca una colisión con una función hash que comparar datos byte por byte [ref1, ref2, ref3, ref4, ref5]. La probabilidad de error de hardware está en el rango de 2^-12 y 2^-15 [ref6]. Si esperas para generar N = 2^q valores hash entonces su probabilidad de colisión puede ser dada por esta ecuación, que ya tiene en cuenta la birthday paradox:
El número de bits de la función hash es directamente proporcional a su complejidad computacional. Por lo tanto, le interesa encontrar una función hash con los bits mínimos posibles, a la vez que puede mantener la probabilidad de colisión a valores aceptables.
He aquí un ejemplo de cómo hacer que el análisis:
De esa ecuación la probabilidad de colisión para varios tamaños de hash es la siguiente:
- P (de hash = 64 bits) = 2^(2 * 25-64 + 1) = 2^-13 (menor que 2^-12)
- P (hash = 128 bits) = 2^(2 * 25-128 + 1) 2^-77 (mucho menos que 2^-12)
Ahora solo tiene que decidir qué función hash no criptográfica de 64 o 128 bits que usará, saber que 64 bits es bastante cercano a la probabilidad de error de hardware (pero será más rápido) y 128 bits es una opción mucho más segura (aunque más lenta).
A continuación puede encontrar una pequeña lista eliminada de la wikipedia de las funciones hash no criptográficas. Sé Murmurhash3 y es mucho más rápido que cualquier función hash criptográfica:
- Fowler–Noll–Vo: 32, 64, 128, 256, 512 y 1024 bits
- Jenkins: 64 y 128 bits
- MurmurHash: 32, 64, 128 y 160 bits
- CityHash: 64, 128 y 256 bits
Antes que nada, gracias por dedicar el tiempo para explicar esto; Realmente lo aprecio. En segundo lugar, quería hacer una pregunta aclaratoria: ¿cómo se defiende de manera diferente contra un adversario frente a una gran cantidad de archivos? ¿No es el resultado final el mismo: generación de datos suficientes para que finalmente encuentres dos datos que tengan el mismo efecto? (Ya sea al azar, o a través del análisis específico del algoritmo). –