Básicamente estoy preparando frases para ponerlas en la base de datos, pueden estar mal formadas, por lo que quiero almacenar un hash corto de ellas (simplemente compararé si existen o no, por lo que el hash es ideal).
Supongo que MD5 es bastante lento en más de 100,000 solicitudes, por lo que quería saber cuál sería el mejor método para mezclar las frases, ¿tal vez implementar mi propia función hash o usarlo hash('md4', '...'
sería más rápido al final?
Sé que MySQL tiene MD5 (), por lo que complementaría un poco de velocidad en el final de la consulta, pero tal vez haya una función de hash más rápida en MySQL. No sé si eso funcionaría con PHP.
Respuestas:
CRC32 es bastante rápido y tiene una función: http://www.php.net/manual/en/function.crc32.php
Pero debe tener en cuenta que CRC32 tendrá más colisiones que MD5 o incluso hashes SHA-1, simplemente debido a la longitud reducida (32 bits en comparación con 128 bits, respectivamente, 160 bits). Pero si solo desea verificar si una cadena almacenada está dañada, estará bien con CRC32.
fuente
Y el código utilizado para generar esto es:
fuente
hash_algos()
. El siguiente código de evaluación comparativa de hash estaba en los comentarios de PHP ==> codepad.viper-7.com/5Wdhw6md5
más rápidos. Una mejor prueba será aleatorizar el contenido y la longitud de las cadenas también. De esta forma tenemos una mejor idea sobre el rendimiento real del mundo real. Esto también evitará el almacenamiento en caché. Echa un vistazo: rendimiento de la suma de comprobación de hash phpLista clasificada donde cada bucle comparte la misma cosa que todas las demás.
Y la salida
fuente
strlen($characters)
debería serstrlen($characters) - 1
:)Hay una comparación de velocidad en el sitio xxhash. Copia pegándolo aquí:
Por lo tanto, parece que xxHash es, con mucho, el más rápido, mientras que muchos otros superan los hashes más antiguos, como CRC32, MD5 y SHA.
https://code.google.com/p/xxhash/
Tenga en cuenta que este es el pedido en una compilación de 32 bits. En una compilación de 64 bits, el orden de rendimiento es muy diferente. Algunos de los hashes se basan principalmente en multiplicaciones y recuperaciones de 64 bits.
fuente
Parece que crc32 es más rápido para mensajes pequeños (en este caso 26 caracteres) mientras que md5 para mensajes más largos (en este caso> 852 caracteres).
fuente
Actualización de 2019: esta respuesta es la más actualizada. Las bibliotecas para apoyar el soplo están ampliamente disponibles para todos los idiomas.
La recomendación actual es utilizar la familia Murmur Hash (ver específicamente las variantes murmur2 o murmur3 ).
Los hash de murmullo fueron diseñados para un hashing rápido con colisiones mínimas (mucho más rápido que CRC, MDx y SHAx). Es perfecto para buscar duplicados y muy apropiado para los índices de HashTable.
De hecho, muchas de las bases de datos modernas (Redis, ElastisSearch, Cassandra) lo utilizan para calcular todo tipo de hashes para diversos fines. Este algoritmo específico fue la fuente raíz de muchas mejoras de rendimiento en la década actual.
También se usa en implementaciones de Bloom Filters . Debe tener en cuenta que si está buscando "hashes rápidos", probablemente se enfrenta a un problema típico que se resuelve con los filtros Bloom. ;-)
Nota : el soplo es un hash de propósito general, lo que significa NO criptográfico. No impide encontrar el "texto" de origen que generó un hash. NO es apropiado usar contraseñas hash.
Algunos detalles más: MurmurHash : ¿qué es?
fuente
En lugar de asumir que MD5 es "bastante lento", pruébelo. Una implementación simple basada en C de MD5 en una PC simple (la mía, un Core2 de 2.4 GHz, usando un solo núcleo) puede generar 6 millones de mensajes pequeños por segundo . Aquí hay un pequeño mensaje de hasta 55 bytes. Para mensajes más largos, la velocidad de hash MD5 es lineal con el tamaño del mensaje, es decir, procesa datos a aproximadamente 400 megabytes por segundo. Puede observar que esto es cuatro veces la velocidad máxima de un buen disco duro o una tarjeta de red gigabit ethernet.
Dado que mi PC tiene cuatro núcleos, esto significa que los datos de hash tan rápido como mi disco duro pueden proporcionar o recibir usos como máximo del 6% de la potencia informática disponible. Se necesita una situación muy especial para que la velocidad de hash se convierta en un cuello de botella o incluso para inducir un costo notable en una PC.
En arquitecturas mucho más pequeñas donde la velocidad de hash puede volverse algo relevante, es posible que desee usar MD4. MD4 está bien para fines no criptográficos (y para fines criptográficos, no debe usar MD5 de todos modos). Se ha informado que MD4 es incluso más rápido que CRC32 en plataformas basadas en ARM.
fuente
Consideración
La respuesta a continuación no responde la pregunta como se le preguntó, ya que no recomienda las funciones hash. Recuerde, "Una función hash es cualquier función que se puede utilizar para asignar datos de tamaño arbitrario a valores de tamaño fijo". (Wikipedia) La respuesta a continuación recomienda transformaciones que no garantizan resultados de tamaño fijo.
Si está dispuesto a relajar el requisito de usar una función hash , siga leyendo ...
Respuesta original
Sugiero urlencode () o base64_encode () por estos motivos:
Adaptando el código de referencia en otras partes de estas respuestas, he demostrado que cualquiera de estos es mucho más rápido que cualquier algoritmo hash. Dependiendo de su aplicación, puede usar urlencode () o base64_encode () para limpiar cualquier cadena 'malformada' que desee almacenar.
fuente
Paso uno: Instale libsodium (o asegúrese de estar usando PHP 7.2+)
Paso dos: utilice uno de los siguientes:
sodium_crypto_generichash()
, que es BLAKE2b , una función hash más segura que MD5 pero más rápida que SHA256. (El enlace tiene puntos de referencia, etc.)sodium_crypto_shorthash()
, que es SipHash-2-4 , que es apropiado para las tablas hash pero no se debe confiar en su resistencia a la colisión._shorthash
es aproximadamente 3 veces más rápido_generichash
, pero necesita una llave y tiene un riesgo pequeño pero realista de colisiones. Con_generichash
, es probable que no tenga que preocuparse por las colisiones y no necesite usar una llave (pero puede querer hacerlo de todos modos).fuente
sodium_crypto_generichash(), which is BLAKE2b, a hash function more secure than MD5 but faster than SHA256. (Link has benchmarks, etc.)
- blake2b seguro lo es, pero una implementación PHP de USERLAND de blake2b va a ser mucho más lenta que el sha256 implementado en C para PHP ... desearía que PHP pudiera adoptar blake2b en la suite hash_algos () ..Si está buscando un método rápido y único, le recomiendo xxHash o algo que use el comando incorporado crc32c de la cpu más reciente, consulte https://stackoverflow.com/a/11422479/32453 . También se vincula allí a hashes posiblemente incluso más rápidos si no le importa tanto la posibilidad de colisión.
fuente
Adler32 funciona mejor en mi máquina. Y
md5()
resultó más rápido quecrc32()
.fuente
La implementación de md5 dentro de hash es un poco más rápida que md5 (). Por lo tanto, esta puede ser una opción u otra, intente:
Puede ver en http://www.dozent.net/Tipps-Tricks/PHP/hash-performance
fuente
CRC32 es más rápido, pero menos seguro que MD5 y SHA1. No hay tanta diferencia de velocidad entre MD5 y SHA1.
fuente