Intereting Posts
Есть ли способ сделать gnome-terminal похожим на чистую Arch? Что происходит, когда вы пишете / dev / null? В чем смысл? lxc + btrfs – Создать, а затем удалить каталог с круговой символической ссылкой, вызывает устаревший дескриптор файла Как установить зависимости предложений пакета Чтение с / dev / устройств ввода без прав root Как конденсировать подкаталоги Обнаружение раскладки клавиатуры, набрав клавиши на archlinux Как я могу удалить весь текст между фигурными скобками в многострочном текстовом файле? совместимость / etc / shadow и / etc / passwd Как изменить редактор GNOME по умолчанию? Удалить файл во время его использования повторное использование последнего вывода команды с заданным индексом / строкой-номером Изменение вхождения строки в файл при соблюдении новых строк строки DOS Как сжать папку TMPFS? Как создать эту символическую ссылку в Unix?

Различные методы получения SHA1 дают разные результаты

Я узнаю о SHA1 (в частности, по Git), и я хотел здравомыслия – проверить мое понимание, вычислив SHA1 строки различными способами – я ожидал идентичные хэши SHA1, но вместо этого я получил отличные результаты из трех из четырех методов:

>git hash-object --stdin <<< "Apple Pie" 23991897e13e47ed0adb91a0082c31c82fe0cbe5 

,

 >sha1sum <<< "blob 9\0Apple Pie" 332cd56150dc8b954c0b859bd4aa6092beafa00f - 

,

 >printf 'blob 9\0Apple Pie' > foo.txt >sha1sum foo.txt 9eed377bbdeb4aa5d14f8df9cd50fed042f41023 foo.txt 

,

 >openssl sha1 foo.txt SHA1(foo.txt)= 9eed377bbdeb4aa5d14f8df9cd50fed042f41023 

В принятом ответе на этот вопрос переполнения стека говорится, что git hash-object запускает хэш SHA1 по указанному контенту с префиксом «blob [размер файла] / 0». Таким образом, я явно префикс этого текста для строк, которые я тестировал, с помощью метода non-git.

Почему все эти разные результаты? Я думал, что SHA1 является специфическим и уникальным хэшем данной строки, и что не было разных «типов» SHA1 – это не так?

Различия не исходят от SHA1, а от входа. Синтаксис здесь-строки добавляет новую строку, как мы можем видеть с od :

 $ od -c <<< foo 0000000 foo \n 

Таким образом, в вашей команде git ввод – это десять символов Apple Pie\n .

Кроме того, двойные кавычки, которые вы использовали в <<< "blob 9\0Apple Pie" строках, не поддерживают обратные следы, такие как \n или \nnn , поэтому <<< "blob 9\0Apple Pie" дает строку, содержащую буквальный обратный слэш и нуль.

printf однако интерпретирует \0 как байт NUL, и он не добавляет завершающую новую строку, поэтому при добавлении новой строки и фиксированной длине мы должны получить ожидаемый результат:

 $ printf 'blob 10\0Apple Pie\n' | sha1sum 23991897e13e47ed0adb91a0082c31c82fe0cbe5 - 

Мы могли бы попытаться сделать то же самое с этой строкой, используя цитату из $'' которая поддерживает \0 как представление байта NUL, но это может не работать во всех оболочках, так как байт NUL заканчивает строку. Например, Bash не может справиться с этим, zsh может:

 $ zsh -c "sha1sum <<< $'blob 10\0Apple Pie'" 23991897e13e47ed0adb91a0082c31c82fe0cbe5 -