2010-08-25 25 views

Répondre

8

Comme le dit Zach, l'ID de changeset est calculé en utilisant le SHA-1 hash function. Ceci est un exemple d'une fonction de hachage cryptographiquement sécurisée. Les fonctions de hachage cryptographiques prennent une chaîne d'entrée de longueur arbitraire et produisent un résumé à longueur fixe à partir de cette chaîne. Dans le cas de SHA-1, la longueur de sortie est fixée à 160 bits, dont Mercurial ne montre par défaut que le premier 48 bits (12 chiffres hexadécimaux).

Les fonctions de hachage cryptographique ont la propriété qu'il est extrêmement difficile de trouver deux entrées différentes qui produisent la même sortie, c'est-à-dire qu'il est difficile de trouver les chaînes x != y telles que H(x) == H(y). C'est ce qu'on appelle la résistance aux collisions. Comme Mercurial utilise la fonction SHA-1 pour calculer l'ID de l'ensemble de modifications, vous obtenez le même ID de jeu de modifications pour des entrées identiques (changements identiques, noms de committer et dates identiques). Cependant, si vous utilisez différentes entrées (x != y) lorsque vous obtiendrez différentes sorties (ID de changeset) en raison de la résistance de collision. En d'autres termes, si vous ne disposez pas de différents ID d'ensemble de modifications pour différentes entrées, vous avez trouvé une collision pour SHA-1! Jusqu'à présent, personne n'a jamais trouvé de collision pour SHA-1, ce sera donc une découverte majeure.


De manière plus détaillée, la fonction de hachage SHA-1 est utilisé d'une manière récursive dans mercuriel. Chaque hachage changeset est calculée par concaténer:

  • ID manifeste
  • commettras nom d'utilisateur
  • commettras Date
  • fichiers affectés
  • engagent un message
  • premier parent changeset ID
  • second parent changeset ID

puis de lancer SHA-1 sur tout ceci (voir changelog.py et revlog.py). Étant donné que la fonction de hachage est utilisée de manière récursive, le hachage de l'ensemble de modifications corrige l'historique complet jusqu'à la racine dans le graphique de l'ensemble de modifications. Cela signifie également que vous n'obtiendrez pas le même ID de jeu de modifications si vous ajoutez la ligne Hello World! à deux projets différents en même temps avec le même message de validation: lorsque leurs historiques sont différents (différents jeux de modifications parent), les deux nouveaux changesets aura des ID différents.

+0

Intéressant que personne n'ait encore trouvé de collision dans une fonction de hachage SHA-1! – gbmhunter

5

Les ID de l'ensemble de modifications de Mercurial sont des hachages SHA-1 du "manifeste" pour chaque ensemble de modifications. Il imprime seulement la première douzaine de chiffres hexadécimaux de l'ID global, mais il utilise le SHA-1 complet pour les opérations internes. Il n'y a aucune garantie qu'ils sont uniques, mais il est suffisamment improbable pour des raisons pratiques.

See here for gory details.