Visual FoxPro 7 - Вычисление MD5 сигнатур файлов
Зачем это понадобилось
Возникла задача определить "качество" хранения и копирования неких больших файлов. Создавались они само собой на жестком диске , потом могли быть скопированы по локальной сети, закачивались на FTP сервер, записывались на CDR(W). Тут и встала проблема обнаружения "битых" копий. Общий метод борьбы известен: считай контрольную сумму. Какой из алгоритмов выбрать? Остановились на MD5 по следующим причинам:
- это современный, стойкий, быстрый алгоритм
- существуют консольные утилиты для вычисления
- бесплатная реализация в виде динамической библиотеки
- нафига еще искать, если это прекрасно работает ;)
The MD5 Message-Digest Algorithm
Сначала заставим Google поискать "md5". В первых строках получаем ссылку на MD5 Homepage (unofficial) откуда узнаем, что
MD5 был разработан в 1992 году Профессором Ronald L. Rivest из Массачусетского технологического института (MIT), одним из основателей RSA Security. Подробное описание можно найти в RFC 1321, а если коротко, то
[MD5 алгоритм] получает на вход сообщение произвольной длины и на выходе выдает "подпись"(сигнатуру) длиной 128 битов. Предполагается, что не существует двух сообщений имеющих одинаковые сигнатуры, или, что невозможно создать сообщение с заранее заданной сигнатурой. MD5 алгоритм в основном используется в крипрографических приложениях типа RSA. По существу, MD5 - это способ проверки целостности данных, гораздо более надежный, чем контрольная сумма или другие методы.
Другой умный мужик Francisco Carlos Piragibe de Almeida написал нам на счастье a DLL with a BAS wrapper module
Кроме того находим парочку консольных утилит
Условия использования простые - не забывайте указать "RSA Data Security, Inc. MD5 Message-Digest Algorithm" в своих программах и других материалах. Что собственно и делем ;)
Начинаем реализовавать новые знания
Для начала бэйсиковскую программку переводим на лисиный язык, попутно исправляя ошибки (кому интересно может тоже поразвлекаться с Fault Error) и оформляя все в виде класса.
*-------------------------------------------------- * Это будет метод Init *-------------------------------------------------- DECLARE INTEGER MDStringFix IN aamd532.dll STRING s, LONG l, STRING r DECLARE INTEGER MDFile IN aamd532.dll STRING f, STRING r *-------------------------------------------------- * Function MD5String -- оформим одноименным методом *-------------------------------------------------- PARAM s r = SPACE(32) l = LEN(s) = MDStringFix( s, l, @r) RETURN r *-------------------------------------------------- * Function MD5File -- оформим одноименным методом *-------------------------------------------------- PARAM fname r = SPACE(32) = MDFile( fname, @r) RETURN r
В Command окне протестируем оба метода. Для проверки первого в конце RFC 1321 приведены тестовые образцы. Для проверки сигнатуры файла возьмем образец из дистрибутива FreeBSD 4.1-RELEASE В каждой папке с файлами там имеется файл checksum.md5, который представляет собой список сигнатур файлов.
set classlib to md5 o=createobject("md5") && ------ Правильные ответы ------- ? o.md5string("") && d41d8cd98f00b204e9800998ecf8427e ? o.md5string("a") && 0cc175b9c0f1b6a831c399e269772661 ? o.md5string("abc") && 900150983cd24fb0d6963f7d28e17f72 ? o.md5string("message digest") && f96b697d7cb7938d525a2f31aaf161d0 ? o.md5string(space(15000000)) && Сигнатура 15 миллионов пробелов ;) ? o.md5file("bin.aa") && e16d5641bd71c1308b9a85d47b3e6309 ? o.md5file("blabla.bla") && FILE NOT FOUND
Собственно метод, используемый во FreeBSD, нас вполне устраивает. Перед тем как переместить данные будем создавать файл checksum.md5 Для этого служит метод нашего класса MD5MakeList, которому будем передавать путь к папке с данными, а он породит нам список и вернет число обработанных файлов или -1 при ошибке. Позднее в класс были добавлены простенький "прогрессбар" (чтобы пользователь не скучал ;), а также свойства:
- StopAtError -- если .F., то процесс обсчета не прерывается при ошибках.
- BadFileCount -- после MD5MakeList содержит число необсчитанных файлов.
Download
Это архив с классом md5.vc*, библиотекой aamd532.dll и утилиткой md5.exe
aamd532.dll скопируйте в \Windows\System или \WINNT\System32
PS. MD5 (md5vfp.zip) = dc8e6ec6d0e84fff9fb4c73289c09210 :)
Скачать md5vfp.zip [18 Кб]Оставить комментарий
Комментарии
3 часа поиска и прямо в точку.
Мне, вообще-то, нужен этот исходник для создания уникального индекса по значению мемо-полей...