web-dev-qa-db-fra.com

Quel algorithme de checksum dois-je utiliser?

Je construis un système qui doit pouvoir trouver si des blobs d’octets ont été mis à jour . Plutôt que de stocker l'intégralité du blob (ils peuvent aller jusqu'à 5 Mo), je pense que je devrais calculer une somme de contrôle, la stocker et calculer la même somme de contrôle un peu plus tard, pour voir si le blog a été mis à jour .

L'objectif est de minimiser les éléments suivants (dans cet ordre):

  • taille de la somme de contrôle 
  • le temps de calculer 
  • probabilité de collision (2 sommes de contrôle identiques ayant lieu même si le contenu a été modifié).

Il est acceptable que notre système ait une collision ne dépassant pas 1/1 000 000. La préoccupation n'est pas la sécurité, mais simplement la détection des mises à jour/erreurs, de sorte que les collisions rares sont acceptables. (C'est pourquoi je le mets en dernier dans les choses à minimiser).

De plus, nous ne pouvons pas modifier les blocs de texte nous-mêmes.

Bien sûr, md5, crc ou sha1 me viennent à l’esprit, et si je voulais une solution rapide, je le ferais. Cependant, plus qu’une solution rapide, je cherche ce qui pourrait être une comparaison de différentes méthodes ainsi que des avantages et des inconvénients

52
Julien Genestoux

Je vous suggère de regarder cette page SO , CRC vs MD5/SHA1.
La vitesse et les collisions sont discutées dans cet autre fil .
Et comme toujours Wikipedia est votre ami.

Si je devais choisir, il y a une question importante à répondre: voulez-vous que dans tous les cas il n'y ait pas de collision - ou, du moins, que la probabilité soit si faible qu'elle soit proche du risque de collision entre la Lune et la Terre dans les 5 prochaines minutes?

Si oui, choisissez la famille SHA.
Dans votre cas, je modifierais la façon dont la mise à jour} est effectuée.
Par exemple, un nombre incrémentiel pourrait être associé au blob et être envoyé à la place du hash, la demande de mise à jour serait requise si le numéro était différent le autre côté. La probabilité de collision dans ce cas va de ~ 10 ^ -18 à ~ 0 (essentiellement 0 + probabilité de bug) ...

Edit commentaires suivants

Trouvé cet algorithme, Alder-32, qui convient aux longs messages (MB) avec un CRC de 32 bits, soit environ 1 1/10 ^ 9 (MD5 ayant une longueur de 128 bits).
C'est rapide à calculer.
Adler-32 . Il y en a qui viennent échantillon (lien) au bas.

25
Ring Ø

Blake2 est la fonction de hachage la plus rapide que vous pouvez utiliser et qui est principalement adoptée:

BLAKE2 n'est pas seulement plus rapide que les autres bonnes fonctions de hachage, il l'est encore plus rapide que MD5 ou SHA-1 La source

Le vainqueur du concours SHA-3 était l’algorithme Keccak mais n’a pas encore de mise en œuvre populaire n’est pas adopté par défaut dans les distributions GNU/Linux. Au lieu de cela, Blake2, candidat au concours SHA-3, est plus rapide que Keccak et fait partie de GNU coreutils . Donc, sur votre distribution GNU/Linux, vous pouvez utiliser b2sum pour utiliser l’algorithme de hachage Blake2.

0
noraj