2016-08-21 4 views
0

Я хочу, чтобы иметь возможность вычислить CRC файла, чтобы иметь возможность проверить, изменился ли файл в любой момент в будущем (например, день 1: filename.txt = A, день 2 filename.txt = B -> Файл был изменен).Расчет CRC Игнорирование имени файла (Python 3.5)

Если возможно (и это то место, где я застреваю), я хотел бы иметь возможность вычислить CRC файла без учета имени файла, чтобы иметь возможность распознавать изменение имени файла (например, день 1: filename.txt имеет значение CRC X, день 2: newFileName.txt имеет значение CRC X -> тот же файл, новое имя файла).

Я рассмотрел обходное решение, которое должно изменить имя файла на что-то стандартное, прежде чем проверять CRC, но я подумал, есть ли более простой способ сделать это.

+0

Почему бы не использовать хэши sha1 или md5 – peter

+1

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

+0

Я предположил, что имя файла повлияет на выход алгоритма (crc/sha1/md5 и т. Д.). Если алгоритм использует только содержимое файла, то 2 файла с разными именами файлов, но как контент, будут генерировать один и тот же вывод. Это понимание решает мою проблему красиво - спасибо! – user3535074

ответ

1

Я не собираюсь писать код для вас. Тем не менее, то, что вы можете сделать:

  1. создать словарный ключ = имя файл, значение = MD5/SHA1 независимо от, скажем, dict1
  2. создать словарный ключ = MD5/SHA1, значение = имя_файл, скажет dict2

Что вы не сможете найти, но это имя файла + filecontents. Вы не сможете увидеть, является ли это удалением + новый файл или переименовать + изменить содержимое. Это предел.

Редактировать: Я лгал о том, что не писал код. Я написал несколько примеров кода для вычисления контрольной суммы MD5 для текущего модуля (только для демонстрационных целей).

import hashlib 

with open(__file__,"rb") as f: # __file__ is full path to current .py file 
    contents=f.read() 

m = hashlib.md5(contents) 
print(m.hexdigest()) 

Я получаю ebb6e4753cfd7e23dae884a784bc1587 но результаты могут отличаться в зависимости от линии окончаний, количество пустых строк ...

Я предлагаю вам попробовать это сами, а затем переименовать/копировать файл питона на другой, чтобы доказать что это не изменится. Затем добавьте комментарий где-нибудь, это изменится ... Удачи вам в вашем проекте.

Редактировать 2: afterthought: вы можете прочитать о системе конфигурации Git. Он использует систему CRC/MD5, чтобы проверить, не изменились ли файлы. Я не знаю много об этом, но это может привести к вашим целям без вашего кодирования.

+0

Отличная идея! – user3535074

+0

Можете ли вы подтвердить, что Марк Адлер прокомментировал выше? Если да, я могу принять ответ (ваша идея была велика, но не решила моих сомнений в том, как удалить имя файла из алгорифма crc). – user3535074

+0

отредактированный пост, вы можете экспериментировать свободно. –

Смежные вопросы