Файл с исследовательскими данными после передачи открывается, но это ещё не показывает, что вы получили ту же версию. Один способ сверки — вычислить SHA-256 полученного файла и сравнить с контрольной суммой исходного. Для сравнения нужны один и тот же алгоритм и полные значения, а также понятный источник эталонной суммы.

Ниже — законченный учебный пример с четырьмя специально созданными текстовыми файлами. Мы действительно вычислили их хеши в Python и PowerShell; это не результаты исследования студентов. В примере переименование сохраняет сумму, а изменение регистра первой буквы или окончания строки даёт другие значения.

Что именно сравнивает контрольная сумма

Документация Microsoft описывает Get-FileHash как команду вычисления хеша содержимого файла. Имя и расширение могут измениться без изменения содержимого и его хеша. Поэтому совпадающее название не заменяет сверку, а другое название само по себе не говорит о повреждении.

Договоритесь, какой файл считается исходным и каким алгоритмом получена сумма. Для этой инструкции используем SHA-256. Сравнивать SHA-256 с результатом другого алгоритма бессмысленно: это разные вычисления. Получите эталонную сумму от отправителя так, чтобы было ясно, к какой версии она относится. Сумма из ненадёжного источника сама по себе не подтверждает происхождение файла.

Совпадение SHA-256 служит практической проверкой совпадения с эталонным содержимым. Это не математическое доказательство невозможности коллизий, не подтверждение авторства и не проверка достоверности научных выводов. Не смешивайте эти задачи.

Четыре учебных файла: точные байты и полные хеши

В исходном study-lf.txt записано слово study и один байт LF. Для этих латинских символов используем ASCII без дополнительной метки кодировки. Обозначение \n ниже означает один перевод строки LF, а \r\n — два байта CR и LF; это не буквальные обратные косые черты в файле. В copy-renamed.txt байты те же. В двух других файлах намеренно изменено содержимое.

ФайлБайты в записи PythonРазмер, байтСовпадение с исходным
study-lf.txtb"study\n"6Эталон примера
copy-renamed.txtb"study\n"6Да
study-crlf.txtb"study\r\n"7Нет
study-uppercase.txtb"Study\n"6Нет

Полные контрольные суммы для сверки

study-lf.txt

9eb0b1297f9d96044a3d97f0d9b96a050af93bf6942ffdbd82c9585c57502000

copy-renamed.txt

9eb0b1297f9d96044a3d97f0d9b96a050af93bf6942ffdbd82c9585c57502000

study-crlf.txt

27db4ce4e061ec85041ae87ce05ec6b68a9b906d7d117b6ba35d68aad7536347

study-uppercase.txt

9e6b1ca0be387475737b3c416f60d03b66a598bd4b23a63dd3d90874669e6e0f
Оригинальные тестовые файлы:переименованнаякопияstudyсLFимееттужеSHA256;вариантыCRLFиStudyимеютдругиесуммы.
Авторская схема реально созданных тестовых файлов. Показаны первые12знаков только для читаемости; в проверке сравнивают полные64шестнадцатеричныхзнака. Это не снимок терминала.

Проверьте размеры: пять букв и LF дают 6 байт; пять букв, CR и LF — 7. Замена строчной s на прописную S в нашем примере меняет содержимое, но оставляет размер 6 байт. Следовательно, одинакового размера тоже недостаточно для сверки. Здесь результаты относятся именно к указанным байтам: мы не проверяли передачу через Git, почтовый сервис или другой интерфейс.

Как воспроизвести пример без неоднозначности

Создайте отдельную пустую учебную папку. Следующий код Python создаёт только четыре файла примера и затем печатает их размер и SHA-256. Если такие имена уже есть, запись заменит их содержимое, поэтому не запускайте пример в папке с рабочими оригиналами. Запись байтов выбрана специально, чтобы редактор не добавил другой перевод строки.

from pathlib import Path
import hashlib

files = {
    "study-lf.txt": b"study\n",
    "copy-renamed.txt": b"study\n",
    "study-crlf.txt": b"study\r\n",
    "study-uppercase.txt": b"Study\n",
}
for name, data in files.items():
    Path(name).write_bytes(data)
    print(name, len(data), hashlib.sha256(data).hexdigest())

Сохраните код как make_example.py в этой папке и запустите установленным интерпретатором Python. Название команды запуска зависит от вашей установки: например, python make_example.py, если именно эта команда вызывает нужный Python. Все четыре напечатанные суммы должны соответствовать таблице. Если нет — сначала сравните сам код, рабочую папку и точные байты созданных файлов.

Сверка одного файла в PowerShell

Откройте PowerShell в учебной папке либо укажите полный путь к файлу. Выполните команду:

Get-FileHash -LiteralPath "study-lf.txt" -Algorithm SHA256

Get-FileHash покажет алгоритм, хеш и путь. Параметр -LiteralPath позволяет воспринимать путь буквально, а не как шаблон. Microsoft указывает SHA256 как алгоритм по умолчанию; здесь мы задаём его явно, чтобы выбор был виден в команде. Не меняйте исходный файл перед проверкой и убедитесь, что путь указывает на полученную копию.

Сравнивайте все 64 шестнадцатеричных знака. PowerShell в нашем запуске показал буквы в верхнем регистре, Python — в нижнем. При независимой сверке мы привели текстовые представления к одному регистру, после чего значения совпали. Это наблюдение о выполненном учебном запуске; короткие подписи на схеме ниже не предназначены для проверки файла.

Сверка одного небольшого файла в Python

Для небольшого файла примера можно прочитать байты и передать их в hashlib.sha256. Следующий код ничего не записывает в файл:

from pathlib import Path
import hashlib

data = Path("study-lf.txt").read_bytes()
print(hashlib.sha256(data).hexdigest())

Запускайте его в папке с файлом. Ожидаемый результат для наших шести байтов:

9eb0b1297f9d96044a3d97f0d9b96a050af93bf6942ffdbd82c9585c57502000

read_bytes() здесь считывает весь маленький файл. Не переносите этот выбор автоматически на большие исследовательские массивы. Документация hashlib отдельно описывает file_digest для эффективного хеширования файла или файлового объекта с чтением в бинарном режиме; требования функции надо сверить с версией Python. Для нашего примера дополнительная функция не нужна.

Что делать, если суммы не совпали

  1. Проверьте, что сравниваете один алгоритм, полные значения и нужную исходную версию. Не принимайте совпадение нескольких первых знаков за результат сверки.
  2. Сохраните обе версии отдельно. Зафиксируйте путь, размер, полученную сумму и источник эталона. Не перезаписывайте исходник ради «исправления» хеша.
  3. Уточните, сохраняли или преобразовывали ли файл. При известном изменении окончания строки сравните байты: наш пример показывает отдельный случай LF и CRLF, но не устанавливает причину изменения любого чужого файла.
  4. Попросите отправителя повторно вычислить сумму своей версии и при необходимости передать файл ещё раз. Пока расхождение не объяснено, не называйте копию подтверждённой.

Например, для study-crlf.txt мы заранее знаем причину расхождения: добавлен CR. Это не обнаруженная атака и не доказанная ошибка передачи, а намеренное изменение учебного файла. В реальном проекте причина неизвестна до проверки. Простая замена окончания строки ради совпадения суммы может скрыть проблему с выбором версии.

Что записать рядом с данными

  • Имя и назначение исходного файла, а также версию, которую вы договорились передавать.
  • Алгоритм и полную контрольную сумму исходного файла.
  • Откуда получен эталон и когда выполнена сверка.
  • Сумму полученной копии, результат сравнения и пояснение расхождения, если оно исследовано.

Описать состав пакета и команды работы поможет README для исследовательских данных. Контрольная сумма дополняет такое описание, но не заменяет словарь переменных и проверку логики исследования.

Если после проверки передачи нужна помощь уже с подготовкой данных к исследовательскому расчёту, можно обсудить статистический анализ. Заранее согласуйте исследовательский вопрос и объём консультации; наличие этой услуги не означает обещания технической экспертизы файлов.

Источники

Фото: Rafael Minguet Delgado / Pexels