Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Вычисление 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, а если коротко, то
Другой умный мужик 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 при ошибке. Позднее в класс были добавлены простенький "прогрессбар" (чтобы пользователь не скучал ;), а также свойства:
DownloadЭто архив с классом md5.vc*, библиотекой aamd532.dll и утилиткой md5.exe aamd532.dll скопируйте в \Windows\System или \WINNT\System32 PS. MD5 (md5vfp.zip) = dc8e6ec6d0e84fff9fb4c73289c09210 :) Скачать md5vfp.zip [18 Кб] |
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь Рейтинги
|