Je prépare essentiellement des phrases à mettre dans la base de données, elles peuvent être mal formées, je veux donc en stocker un court hachage à la place (je vais simplement comparer si elles existent ou non, donc le hachage est idéal).
Je suppose que MD5 est assez lent sur plus de 100000 demandes, donc je voulais savoir quelle serait la meilleure méthode pour hacher les phrases, peut-être que déployer ma propre fonction de hachage ou utiliser hash('md4', '...'
serait plus rapide à la fin?
Je sais que MySQL a MD5 (), donc cela compléterait un peu la vitesse à la fin de la requête, mais peut-être qu'il y a encore une fonction de hachage plus rapide dans MySQL que je ne sais pas qui fonctionnerait avec PHP ...
Réponses:
CRC32 est assez rapide et il y a une fonction pour cela: http://www.php.net/manual/en/function.crc32.php
Mais il faut savoir que CRC32 aura plus de collisions que MD5 ou même les hachages SHA-1, simplement en raison de la longueur réduite (32 bits contre 128 bits respectivement 160 bits). Mais si vous voulez juste vérifier si une chaîne stockée est corrompue, tout ira bien avec CRC32.
la source
Et le code utilisé pour générer ceci est:
la source
hash_algos()
. Le code d'analyse comparative de hachage suivant était dans les commentaires PHP ==> codepad.viper-7.com/5Wdhw6md5
plus rapides. Un meilleur test sera de randomiser également le contenu et la longueur des chaînes. de cette façon, nous avons une meilleure idée de la performance réelle dans le monde réel. Cela évitera également la mise en cache. Jetez un oeil: performances de la somme de contrôle de hachage phpListe classée où chaque boucle partage la même chose à crypter que toutes les autres.
Et la sortie
la source
strlen($characters)
devrait êtrestrlen($characters) - 1
:)Il y a une comparaison de vitesse sur le site xxhash. Copiez-le en le collant ici:
Il semble donc que xxHash soit de loin le plus rapide, tandis que beaucoup d'autres battent les hachages plus anciens, comme CRC32, MD5 et SHA.
https://code.google.com/p/xxhash/
Notez qu'il s'agit de l'ordre sur une compilation 32 bits. Sur une compilation 64 bits, l'ordre des performances est probablement très différent. Certains des hachages sont fortement basés sur des multiplications et des récupérations 64 bits.
la source
Il semble que crc32 soit plus rapide pour les petits messages (dans ce cas 26 caractères) tandis que md5 pour les messages plus longs (dans ce cas> 852 caractères).
la source
Mise à jour 2019: cette réponse est la plus à jour. Les bibliothèques prenant en charge le murmure sont largement disponibles pour toutes les langues.
La recommandation actuelle est d'utiliser la famille Murmur Hash (voir spécifiquement le murmur2 ou murmur3 variantes ).
Les hachages Murmur ont été conçus pour un hachage rapide avec des collisions minimales (beaucoup plus rapides que CRC, MDx et SHAx). C'est parfait pour rechercher des doublons et très approprié pour les index HashTable.
En fait, il est utilisé par de nombreuses bases de données modernes (Redis, ElastisSearch, Cassandra) pour calculer toutes sortes de hachages à des fins diverses. Cet algorithme spécifique a été à l'origine de nombreuses améliorations de performances au cours de la décennie actuelle.
Il est également utilisé dans les implémentations de filtres Bloom . Vous devez savoir que si vous recherchez des "hachages rapides", vous êtes probablement confronté à un problème typique qui est résolu par les filtres Bloom. ;-)
Remarque : le murmure est un hachage à usage général, ce qui signifie NON cryptographique. Cela n'empêche pas de trouver le "texte" source qui a généré un hachage. Il n'est PAS approprié de hacher les mots de passe.
Quelques détails supplémentaires: MurmurHash - qu'est-ce que c'est?
la source
Au lieu de supposer que MD5 est "assez lent", essayez-le. Une implémentation simple de MD5 basée sur C sur un simple PC (le mien, un Core2 2,4 GHz, utilisant un seul cœur) peut hacher 6 millions de petits messages par seconde . Un petit message est ici n'importe quoi jusqu'à 55 octets. Pour les messages plus longs, la vitesse de hachage MD5 est linéaire avec la taille du message, c'est-à-dire qu'elle transforme les données à environ 400 mégaoctets par seconde. Vous pouvez noter que c'est quatre fois la vitesse maximale d'un bon disque dur ou d'une carte réseau Gigabit Ethernet.
Étant donné que mon PC a quatre cœurs, cela signifie que le hachage des données aussi vite que mon disque dur peut fournir ou recevoir utilise au maximum 6% de la puissance de calcul disponible. Il faut une situation très particulière pour que la vitesse de hachage devienne un goulot d'étranglement ou même induise un coût notable sur un PC.
Sur des architectures beaucoup plus petites où la vitesse de hachage peut devenir quelque peu pertinente, vous pouvez utiliser MD4. MD4 convient à des fins non cryptographiques (et à des fins cryptographiques, vous ne devez de toute façon pas utiliser MD5). Il a été rapporté que MD4 est encore plus rapide que CRC32 sur les plates-formes ARM.
la source
Caveat
La réponse ci-dessous ne répond pas à la question posée, car elle ne recommande pas les fonctions de hachage. Rappelez-vous, "Une fonction de hachage est toute fonction qui peut être utilisée pour mapper des données de taille arbitraire à des valeurs de taille fixe." (Wikipedia) La réponse ci-dessous recommande des transformations qui ne garantissent pas des résultats de taille fixe.
Si vous êtes prêt à assouplir la nécessité d'utiliser une fonction de hachage , lisez la suite ...
Réponse originale
Je suggère urlencode () ou base64_encode () pour ces raisons:
En adaptant le code de référence ailleurs dans ces réponses, j'ai démontré que l'un ou l'autre est bien plus rapide que n'importe quel algorithme de hachage. Selon votre application, vous pourrez peut-être utiliser urlencode () ou base64_encode () pour nettoyer les chaînes «mal formées» que vous souhaitez stocker.
la source
Première étape: installez libsodium (ou assurez-vous que vous utilisez PHP 7.2+)
Deuxième étape: utilisez l'une des méthodes suivantes:
sodium_crypto_generichash()
, qui est BLAKE2b , une fonction de hachage plus sécurisée que MD5 mais plus rapide que SHA256. (Le lien a des repères, etc.)sodium_crypto_shorthash()
, qui est SipHash-2-4 , qui est approprié pour les tables de hachage mais ne doit pas être utilisé pour la résistance aux collisions._shorthash
est environ 3 fois plus rapide que_generichash
, mais vous avez besoin d'une clé et vous avez un risque de collision faible mais réaliste. Avec_generichash
, vous n'avez probablement pas besoin de vous soucier des collisions, et vous n'avez pas besoin d'utiliser une clé (mais vous voudrez peut-être quand même).la source
sodium_crypto_generichash(), which is BLAKE2b, a hash function more secure than MD5 but faster than SHA256. (Link has benchmarks, etc.)
- blake2b bien sûr, mais une implémentation PHP USERLAND de blake2b sera beaucoup plus lente que le sha256 implémenté en C pour PHP ... j'aimerais que PHP puisse utiliser blake2b dans la suite hash_algos () ..Si vous recherchez une solution rapide et unique, je recommande xxHash ou quelque chose qui utilise la commande intégrée crc32c du processeur plus récent, voir https://stackoverflow.com/a/11422479/32453 . Il y est également lié à des hachages éventuellement encore plus rapides si vous ne vous souciez pas autant de la possibilité de collision.
la source
Adler32 fonctionne mieux sur ma machine. Et
md5()
s'est avéré plus rapide quecrc32()
.la source
L'implémentation de md5 à l'intérieur du hachage est un peu plus rapide que md5 (). Donc, cela peut être une option ou une autre, veuillez essayer:
Vous pouvez voir sur http://www.dozent.net/Tipps-Tricks/PHP/hash-performance
la source
CRC32 est plus rapide, mais moins sécurisé que MD5 et SHA1. Il n'y a pas beaucoup de différence de vitesse entre MD5 et SHA1.
la source