MD5SUM для скопированного файла

Похоже, все сводится к тому, что в вашей локали используется кодировка ASCII. ASCII — это американская кодировка 60-х годов, которая является общим знаменателем для большинства современных наборов символов.

Это обычно происходит, когда локали не настроены (все переменные среды LANG, LC_* не установлены) или когда они установлены на C или POSIX.

Этот набор символов определяет 128 символов со значениями байтов от 0 до 127. Все символы, составляющие язык sh и встречающиеся в большинстве имен команд, находятся в ASCII. Но § и ° не являются.

Теперь эти символы на вашей клавиатуре, что должно произойти, когда вы наберете их в эмуляторе терминала?

Если вы запускаете эмулятор терминала в локали с кодировкой ASCII, вы сообщаете эмулятору терминала, что при нажатии A, (XK_a событие нажатия клавиши X11) он необходимо отправить кодировку символа a в кодировке ASCII, то есть 0x61. Но когда вы нажимаете Shift+§ (событие нажатия клавиши XK_grade X11), он должен отправить кодировку для символа °, но в ASCII такого символа нет, так что же делать?

xterm и rxvt решили отправить кодировку ° в наборе символов iso-8859-1. Это 8-битная кодировка большей части западного мира (расширяет ASCII, чтобы охватить большинство символов, используемых в таких языках, как немецкий, французский, британский английский, испанский...). До UTF-8 это была наиболее часто используемая кодировка.

Мои консоли, Eterm и xfce4-терминал отправляют ? для каждого символа, отличного от ASCII.

Мой gnome-терминал и терминатор отправляют кодировку UTF-8 °.

Когда bash получает кодировку iso8859-1 ° (0xb0), как в xterm, что он должен делать?

Мы сказали, что это кодировка ASCII, поэтому 0xb0 соответствует неизвестному символу.

Раньше в США Ctrl+X использовались для ввода символов от 0 до 31 (управляющие символы).В ASCII это будет отправлять младшие 5 бит соответствующего символа. Например, A равно 0x41, a равно 0x61, Ctrl+A отправит 0x61 и 0x1f, поэтому 0x1 (^A, также известный как символ CA). В то время как Meta+X отправит кодировку x с установленным 8-м битом. a будучи 0x61, Meta+A отправит 0x61 | 0x80, то есть 0xe1. Нажатие Meta+0 отправит 0x30 | 0x80, то есть 0xb0, также известный как M-0 (не-)символ.

В ASCII 0x0 -> 0x1f используются для управляющих символов во времена телетайпа, большинство из которых больше не используются, а от 0x80 до 0xff не используются, так что это был способ ввода кодов, которые можно было использовать для другие вещи, кроме ввода текста. emacs, например, использовал их для клавиш редактирования, символ C-B перемещает курсор на один символ влево, символ MB (не-)перемещает курсор на одно слово влево.

В настоящее время, поскольку большинство людей используют наборы символов, которые расширяют ASCII, используя значения байтов от 0x80 до 0xff, они больше не считаются метасимволами. Meta+X теперь вместо этого обычно отправляет два символа: символы ESC и X.

Тем не менее, в локали, где значения байтов от 0x80 до 0xff не могут быть символами, когда bash (на самом деле readline) считывает значение байта с устройства tty, например 0xb0 , он понимает его как M-0 (который по умолчанию привязан к digit-argument, что объясняет ваш arg: 0).

Это параметр convert-meta в конфигурации readline. Вы найдете в документации readline (man 3 readline), что, когда readline обнаруживает, что кодировка является 7-битной, она устанавливает для нее значение on для преобразования этих байтов 0xb0 в ESC + 0.

Если вы отключите это с:

bind 'set convert-meta = off'

(и при условии, что вход-мета и выход-мета также на). Затем вы обнаружите, что нажатие ° приводит к отображению °. Но это будет кодировка 0xb0 iso8859-1 °, с которой приложения не будут знать, что делать.

Что вам нужно сделать, так это исправить языковой стандарт на тот, который содержит символы °. В настоящее время вам следует рассматривать только UTF-8, поскольку он охватывает все символы и широко поддерживается.

Итак, проверьте конфигурацию своего рабочего стола на наличие настроек интернационализации и выберите что-то вроде de_CH.UTF-8/fr_CH.UTF-8/it_CH.UTF-8 (немецкий/французский/итальяноязычный швейцарский язык с кодировкой UTF-8), которые лучше всего подходят для вашей среды.

Возможно, вам придется выйти из системы и снова войти в систему, чтобы это полностью учитывалось.

Некоторые менеджеры входа в систему иногда также позволяют выбрать языковой стандарт во время входа в систему через раскрывающееся меню.

0
04.03.2016, 18:20
2 ответа

md5sumsha1sum и sha256sum и т.д.) вычисляет хэш содержимого файла. При этом не учитывается имя файла или любые другие метаданные (например, время модификации). Если два файла имеют одинаковое содержимое, то md5sum сгенерирует одинаковый хэш для каждого из них. (Обратите внимание, что вывод md5sum состоит из хэша и имени файла. Хеш не изменится, если вы переименуете файл, но, конечно, имя файла в выходных данных изменится.)

Всегда верно, что два файла, генерирующие разные хеши, имеют разное содержимое. Если скопированный файл генерирует другой хэш, значит, копирование прошло неудачно, или один из файлов был изменен после копирования.

Однако не обязательно верно, что два файла, генерирующие одинаковые хэши, имеют одинаковое содержимое. Поскольку хэши имеют фиксированный размер, существует большое количество различных файлов, которые будут генерировать один и тот же хэш. Это называется коллизией. Но найти коллизию не должно быть легко. (Однако для MD5 это так, поэтому он больше не считается безопасным. MD5 все еще достаточно хорош для обнаружения случайного повреждения файла, но не для злонамеренной модификации.)

.
3
28.01.2020, 02:20

Вывод md5sum изменится, потому что он сообщает само имя файла в последнем поле. Чтобы убрать имя файла и вывести только сам хэш, используйте awk или cut:

md5sum filename | cut -d ' ' -f1
1
28.01.2020, 02:20

Теги

Похожие вопросы