En cuanto a su actualización, sus funciones hash criptográficas estándar (MD5, SHA-1, SHA-2, SHA-3) intentan aproximarse a oráculos aleatorios (y no intentes ser inyectivo). Es decir, intentan asignar cualquier entrada a una salida elegida de manera uniforme y aleatoria en su espacio de salida (y hacer esta asignación de manera consistente). Con una probabilidad abrumadora, los oráculos aleatorios no serán inyectivos cuando el número de entradas posibles sea significativamente mayor que la raíz cuadrada del número de salidas posibles, debido a la paradoja de cumpleaños .
Por ejemplo, si tiene una salida de hash de 128 bits (un hash de 16 bytes con 2 posibles salidas 128 ) y usa un oráculo aleatorio para hacer hash significativamente más que sqrt (2 128 ) = 2 64 entradas, comienza a ser abrumadoramente probable de que haya colisiones. Por otro lado, si tiene menos de 2 entradas 64 , es muy poco probable que tenga una colisión si comenzó con un oráculo aleatorio ideal. (Si tiene alrededor de 2 entradas 64 la probabilidad de ser inyectivo es aproximadamente 1/2; puede haber una colisión o no).
Como ejemplo específico, si hash todas las entradas de 9 bytes posibles de 2 72 , la probabilidad de que un oráculo aleatorio sea inyectivo en un espacio de 16 bytes es aproximadamente exp (-n 2 / 2m ) ≈ 10 -14231 , donde n = 2 72 ≈ 4.7 x 10 21 y m = 2 128 ≈ 3.4 x 10 38 . Esto es increíblemente improbable; aproximadamente el equivalente a jugar powerball (probabilidades de ganar 1 en 292 millones) dos veces a la semana durante 16 años y ganar el premio mayor cada vez sin perder boletos. Y nuevamente, esto es solo para una entrada de 9 bytes; con una entrada de 15 bytes, la probabilidad de ser inyectivo es aproximadamente 10 -1127492937032632506267955467381579 !
Mientras tanto, si tiene todas las entradas posibles de 7 bytes, solo hay 2 56 , por lo que es muy probable que no haya colisiones (es decir, será inyectivo). Como esto es significativamente menor que sqrt (2 128 ), un oráculo aleatorio no sería inyectivo con probabilidad con 0.0000076 (aproximadamente 1 en 130 000 veces no sería inyectivo y el resto del tiempo sería inyectivo).
Consulte la tabla de probabilidad en wikipedia para obtener más información.
Por supuesto, esto no es una prueba para ninguna función hash específica; para demostrarlo, tendríamos que generar una colisión específica dentro del espacio de entrada que, en general, sería difícil de mostrar.
Ahora, si necesita una función inyectiva que actúe de manera similar a un hash, esto es bastante sencillo de lograr mediante el uso de un cifrado de bloque (conocido formalmente como permutación pseudoaleatoria ) como AES y elige una clave aleatoria para cifrarla. Los cifrados de bloque son necesariamente tanto inyectivos como superyectivos. Si un cifrado de bloque no era inyectivo, entonces una persona con la clave y la función de descifrado y un bloque de texto cifrado para descifrar no podrían recuperar el bloque original.
La desventaja de usar un cifrado de bloque en lugar de una función hash es que el cifrado de bloque requiere una entrada de solo una longitud fija y la transforma en una salida de la misma longitud fija. Por ejemplo, AES solo puede tomar una entrada de 128 bits y transformarla en una salida de 128 bits. (Sí, podría usar los modos de cifrado de bloque para transformar entradas más grandes, pero para que sea uno a uno, el tamaño de salida sería de la misma longitud que la entrada). El hecho de que una función hash pueda tomar entradas de tamaño variable y generar un hash de tamaño fijo la hace ideal para muchos propósitos. El hecho de que este requisito de hashes para asignar entradas de tamaño variable tomadas de un espacio de entrada muy grande a un espacio de salida más pequeño significa que no será un inyectivo según el principio del casillero generalmente no es un problema en la práctica.