Назначение ртути глобального идентификатора ревизии - PullRequest
3 голосов
/ 25 августа 2010

Очевидно, Mercurial назначает глобальный идентификатор набора изменений для каждого изменения. Как они гарантируют, что это уникально?

Ответы [ 2 ]

8 голосов
/ 25 августа 2010

Как говорит Зак, идентификатор набора изменений вычисляется с использованием хеш-функции SHA-1 .Это пример криптографической безопасной хеш-функции.Криптографические хеш-функции принимают входную строку произвольной длины и создают дайджест фиксированной длины из этой строки.В случае SHA-1 длина вывода устанавливается равной 160 битам, из которых Mercurial по умолчанию показывает только первые 48 бит (12 шестнадцатеричных цифр).

Криптографические хеш-функции обладают таким свойством, чточрезвычайно трудно найти два разных входа, которые выдают одинаковый результат, то есть трудно найти строки x != y, такие как H(x) == H(y).Это называется сопротивлением столкновению.

Поскольку Mercurial использует функцию SHA-1 для вычисления идентификатора набора изменений, вы получаете один и тот же идентификатор набора изменений для идентичных входных данных (идентичные изменения, идентичные имена коммиттеров и даты).Однако, если вы используете разные входы (x != y), когда вы получите разные выходы (идентификаторы наборов изменений) из-за сопротивления столкновению.

Положите по-разному, если вы не получите разные идентификаторы наборов изменений для разных входов, тогдаВы нашли столкновение для SHA-1!Пока что никто не обнаружил столкновения для SHA-1, так что это будет главным открытием.


Более подробно, хеш-функция SHA-1 рекурсивно используется в Mercurial.Каждый хэш набора изменений вычисляется путем конкатенации:

  • идентификатор манифеста
  • имя пользователя фиксации
  • дата принятия
  • затронутые файлы
  • принятиесообщение
  • первый родительский элемент идентификатор набора изменений
  • второй родительский элемент идентификатор набора изменений

, а затем запуск SHA-1 для всехэто (см. changelog.py и revlog.py ).Поскольку хеш-функция используется рекурсивно, хэш набора изменений будет фиксировать всю историю вплоть до корня на графике набора изменений.

Это также означает, что вы не получите тот же идентификатор набора изменений, если добавите строкуHello World! к двум разным проектам одновременно с одним и тем же сообщением о фиксации - когда их история отличается (разные родительские наборы изменений), два новых набора изменений получат разные идентификаторы.

5 голосов
/ 25 августа 2010

Идентификаторы изменений Mercurial - это SHA-1-хеши "манифеста" для каждого набора изменений.Он печатает только первые дюжины шестнадцатеричных цифр глобального идентификатора, но использует полный SHA-1 для внутренних операций.Фактической гарантии в том, что они уникальны, не существует, но для практических целей это маловероятно.

...