Файл с исследовательскими данными после передачи открывается, но это ещё не показывает, что вы получили ту же версию. Один способ сверки — вычислить 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.txt | b"study\n" | 6 | Эталон примера |
| copy-renamed.txt | b"study\n" | 6 | Да |
| study-crlf.txt | b"study\r\n" | 7 | Нет |
| study-uppercase.txt | b"Study\n" | 6 | Нет |
Полные контрольные суммы для сверки
study-lf.txt
9eb0b1297f9d96044a3d97f0d9b96a050af93bf6942ffdbd82c9585c57502000
copy-renamed.txt
9eb0b1297f9d96044a3d97f0d9b96a050af93bf6942ffdbd82c9585c57502000
study-crlf.txt
27db4ce4e061ec85041ae87ce05ec6b68a9b906d7d117b6ba35d68aad7536347
study-uppercase.txt
9e6b1ca0be387475737b3c416f60d03b66a598bd4b23a63dd3d90874669e6e0f

Проверьте размеры: пять букв и 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. Для нашего примера дополнительная функция не нужна.
Что делать, если суммы не совпали
- Проверьте, что сравниваете один алгоритм, полные значения и нужную исходную версию. Не принимайте совпадение нескольких первых знаков за результат сверки.
- Сохраните обе версии отдельно. Зафиксируйте путь, размер, полученную сумму и источник эталона. Не перезаписывайте исходник ради «исправления» хеша.
- Уточните, сохраняли или преобразовывали ли файл. При известном изменении окончания строки сравните байты: наш пример показывает отдельный случай LF и CRLF, но не устанавливает причину изменения любого чужого файла.
- Попросите отправителя повторно вычислить сумму своей версии и при необходимости передать файл ещё раз. Пока расхождение не объяснено, не называйте копию подтверждённой.
Например, для study-crlf.txt мы заранее знаем причину расхождения: добавлен CR. Это не обнаруженная атака и не доказанная ошибка передачи, а намеренное изменение учебного файла. В реальном проекте причина неизвестна до проверки. Простая замена окончания строки ради совпадения суммы может скрыть проблему с выбором версии.
Что записать рядом с данными
- Имя и назначение исходного файла, а также версию, которую вы договорились передавать.
- Алгоритм и полную контрольную сумму исходного файла.
- Откуда получен эталон и когда выполнена сверка.
- Сумму полученной копии, результат сравнения и пояснение расхождения, если оно исследовано.
Описать состав пакета и команды работы поможет README для исследовательских данных. Контрольная сумма дополняет такое описание, но не заменяет словарь переменных и проверку логики исследования.
Если после проверки передачи нужна помощь уже с подготовкой данных к исследовательскому расчёту, можно обсудить статистический анализ. Заранее согласуйте исследовательский вопрос и объём консультации; наличие этой услуги не означает обещания технической экспертизы файлов.