Bon choix pour un algorithme de checksum léger?
Je me retrouve à avoir besoin de générer une somme de contrôle pour une chaîne de données, à des fins de cohérence. L'idée générale est que le client peut se régénérer à la somme de contrôle basé sur la charge utile qu'il reçoit, et donc de détecter toute corruption qui a eu lieu en transit. Je suis vaguement au courant qu'il existe toutes sortes de principes mathématiques derrière ce genre de chose, et qu'il est très facile pour des erreurs de rendre l'ensemble de l'algorithme inefficace si vous essayez de rouler vous-même.
Donc je suis à la recherche pour obtenir des conseils sur un hachage/algorithme de somme de contrôle avec les critères suivants:
- Il sera généré par Javascript, doit donc être relativement légère par le calcul.
- La validation se fait en Java (si je ne vois pas ce réellement un problème).
- Il faudra saisir un texte (URL-encodé en Unicode, ce qui je crois est en ASCII) d'une longueur modérée, généralement autour de 200 à 300 caractères et dans tous les cas en dessous de 2000.
- La sortie doit être en texte ASCII, et la plus courte, il peut être le mieux.
Je suis principalement intéressé par quelque chose de léger, plutôt que d'obtenir l'absolu le plus petit risque de collisions possibles. Serais-je naïf de croire qu'un enfant de huit caractères serait approprié pour cela? Je tiens également à préciser que ce n'est pas la fin du monde si la corruption n'est pas repris à l'étape de validation (et je n'ai conscience que ce ne sera pas fiable à 100%), si le reste de mon code est nettement moins efficace pour tous les corrompus de l'entrée, qui se glisse à travers.
Edit - merci à tous ceux qui ont contribué. Je suis allé avec le Adler32 option et étant donné qu'il a été pris en charge nativement en Java, très facile à mettre en œuvre en Javascript, rapide à calculer, à ses deux extrémités et de 8 octets de sortie, c'était exactement à mes besoins.
(Notez que je me rends compte que le réseau de transport est peu probable d'être responsable des erreurs de corruption et de ne pas être le pliage mes bras sur cette question; cependant, l'ajout de la somme de contrôle de validation enlève un point de défaillance et les moyens que nous puissions nous concentrer sur d'autres domaines si cela devait se reproduire.)
source d'informationauteur Andrzej Doyle
Vous devez vous connecter pour publier un commentaire.
CRC32 n'est pas trop difficile à mettre en place dans n'importe quelle langue, il est assez bon pour détecter la simple corruption de données et lorsque implemted dans un bon mode, il est très rapide. Cependant, vous pouvez également essayer Adler32, qui est presque aussi bon que CRC32, mais il est encore plus facile à mettre en œuvre (et tout aussi rapide).
Adler32 dans le Wikipedia
CRC32 JavaScript mise en œuvre de l'échantillon
L'une de ces deux (ou peut-être même les deux) sont disponibles en Java, tout droit sorti de la boîte.
Sont conscients que TCP et UDP (et IP, Ethernet,...) fournissent déjà la somme de contrôle de la protection des données en transit?
Sauf si vous êtes en train de faire quelque chose de vraiment bizarre, si vous êtes témoins de la corruption, de quelque chose qui est très mauvais. Je suggère de commencer avec un testeur de mémoire.
Aussi, vous recevez une forte protection de l'intégrité des données si vous utilisez le protocole SSL/TLS.
Javascript mise en œuvre de MD4, MD5 et SHA1. Licence BSD.
D'autres personnes l'ont mentionné CRC32 déjà, mais voici un lien vers le W3C de la mise en œuvre de la CRC-32 pour PNGcomme l'un des quelques-uns bien connus, les sites de bonne réputation avec une référence CRC mise en œuvre.
A quelques années, j'ai essayé de trouver un site connu avec un algorithme CRC ou au moins l'une de cité la source pour son algorithme, & a été presque déchirant mes cheveux jusqu'à ce que j'ai trouvé le PNG page.)
[Mise à JOUR 30/5/2013: Le lien vers l'ancien JS CRC32 de mise en œuvre de mort, j'ai donc maintenant lié à une autre.]
Google CRC32: rapide, et beaucoup plus léger que MD5 et coll. Il y a un Javascript de mise en œuvre ici.
Dans ma recherche pour un JavaScript de la mise en œuvre d'un bon algorithme de somme de contrôle, je suis tombé sur cette question. Andrzej Doyle légitimement choisi Adler32 comme la somme de contrôle, comme il est en effet facile à mettre en œuvre et a quelques excellentes propriétés. DroidOS puis a fourni une mise en œuvre effective en JavaScript, ce qui a démontré la simplicité.
Cependant, l'algorithme peut être encore améliorée comme détaillé dans la page de Wikipédia et mis en œuvre ci-dessous. Le truc, c'est que vous n'avez pas besoin de déterminer le modulo dans chaque étape. Plutôt, vous pouvez vous reporter à la fin. Cela augmente considérablement la vitesse de la mise en œuvre, jusqu'à 6x plus rapide sur Chrome et Safari. En outre, cette optimalisation de ne pas affecter la lisibilité du code en faire un gagnant-gagnant. En tant que tel, cela correspond bien à la question d'origine pour avoir un algorithme /mise en œuvre qui est de calcul de la lumière.
edit: imaya créé un jsperf comparaison un retour tout en montrant la différence de vitesse lors de l'exécution de la version simple, comme détaillé par DroidOSpar rapport à une version optimisée qui reporte le modulo. J'ai ajouté ci-dessus mise en œuvre sous le nom de pleine longueur à la jsperf page montrant que la mise en œuvre est environ 25% plus rapide que celui de imaya et environ 570% plus rapide que la simple mise en œuvre (tests effectués sur Chrome 30): http://jsperf.com/adler-32-simple-vs-optimized/6
edit2: s'il vous plaît n'oubliez pas que, lorsque vous travaillez sur des fichiers volumineux, vous allez finir par frapper à la limite de l'option JavaScript de votre mise en œuvre en termes de a et b des variables. En tant que tel, lorsque l'on travaille avec une grande source de données, vous devez effectuer intermédiaire modulo les opérations pour vous assurer de ne pas dépasser la valeur maximale d'un entier que vous pouvez stocker de manière fiable.
Utilisation SHA-1 JS mise en œuvre. Ce n'est pas aussi lentement que vous le pensez (Firefox 3.0 sur Core 2 Duo 2.4 Ghz hachages de plus de 100 KO par seconde).
Ici est relativement simple, j'ai "inventé" - il n'y a pas de recherches mathématiques, derrière elle, mais il est extrêmement rapide et fonctionne dans la pratique. J'ai aussi inclus Java équivalent que les tests de l'algorithme et montre qu'il y a moins de 1 sur 10 000 000 de chance d'échec (il prend une minute ou deux pour courir).
JavaScript
Java
C'est un vieux thread mais je suppose que c'est encore vu assez souvent si - si vous avez besoin d'une courte mais fiable morceau de code pour générer une somme de contrôle de la Adler32 bits algorithme doit être votre choix. Voici le code JavaScript
Le correspondant de violon demonsrating l'algorithme dans l'action est ici.