Бывают случаи, когда необходимо получать какой-либо хэш для файла. В состав операционной системы входит библиотека криптографии capicom.dll, используя которую можно получить интересующий нас хэш. Привожу код для 7.7, его без труда можно перевести на 8.х
Функция МД5(файл)
ScrCtrl = СоздатьОбъект(«MSScriptControl.ScriptControl»);
ScrCtrl.Language = «vbscript»;
ScrCtrl.AddCode(«
|Function Hash()
|Dim crypt: Set crypt = CreateObject(«»CAPICOM.HashedData»»)
|crypt.Algorithm = 3
|Dim stream: Set stream = CreateObject(«»ADODB.Stream»»)
|stream.Type = 1 ‘ adTypeBinary
|stream.Open
|stream.LoadFromFile(«»»+файл+«»»)
|Do Until stream.EOS : crypt.Hash stream.Read() : Loop
|Hash = crypt.Value
|End Function
|»);
рез = ScrCtrl.Run(«Hash»);
Возврат рез;
КонецФункции
Кроме того, указав в этой функции другой алгоритм можно получить хэш SHA1, MD2, MD4, SHA-256, SHA-384 и SHA-512.
Подробнее http://msdn.microsoft.com/en-us/library/aa382443(VS.85).aspx
UPD: код для 1с8, любезно предоставленный в комментариях Mikelana
Функция МД5(файл) crypt = Новый COMОбъект("CAPICOM.HashedData"); crypt.Algorithm = 3;
stream = Новый COMОбъект("ADODB.Stream"); stream.Type = 1; stream.Open(); stream.LoadFromFile(файл); Пока НЕ stream.EOS Цикл crypt.Hash(stream.Read()); КонецЦикла; Возврат crypt.Value; КонецФункции
Кто бы научил еще контрольную сумму считать… 😐
Когда-то мучал CRC32 по таблице, добился только того что считает, но не всегда корректно — видимо не работает для бинарных файлов, подниму архив, вдруг удастся побороть…
Код:
Set Wrap = CreateObject(«DynamicWrapperX»)
Wrap.Register «ImageHlp.DLL», «MapFileAndCheckSum», «i=sUU», «r=u»
sHeader = 0
sCalcd = 0
ress = Wrap.MapFileAndCheckSum(«c:
eadme.txt», sHeader, sCalcd)
WScript.Echo sCalcd & » » & sHeader & » » & ress
(3) А что все про CRC32? Мне CRC8 надо.
cool.vlad4,спасибо, попробовал, думал crc32, оказалось нет. Вдруг кому пригодиться код:
Показать
(5) Не за, что , я наверное ссылкой вас с толку сбил, просто код взят из той ссылки (я уже не помню правда где)
http://msdn.microsoft.com/en-us/library/ms680355(VS.85).aspx всегда поможет
библиотека msdn
ЗЫ враппер кстати в 1С тоже можно использовать, некогда просто было код на 1с-ке писать
(6) можно, но там проблемы с передачей параметров sHeader и sCalcd возникли. По крайней мере у меня…
уж проще формекс: сервис.ПолучитьХэшМД5(<?>,)
(8) Где ты видел формекс под 8.1 и уж тем более под 8.2
(1)
http://ru.wikipedia.org/wiki/Контрольное_число
http://ru.wikipedia.org/wiki/Контрольная_сумма
http://ru.wikipedia.org/wiki/MD5
…
😀
Вот для 8.* без ScriptControl
Показать
Кириллицу как-то не корректно хеширует 🙁
А как можно подобным способом строку захешировать в md5?
(12) yoyoman, а какая кодировка кириллицы?
Можно написать
или
А чтобы закодировать строку можно попробовать нечто такое:
(13) я себе такую функцию сделал для получения хеша строки (не файла):
Показать
Функция работает нормально если ее кормить латиницей 🙂
Почему сделал через временный файл — потому что я дурак не понял как напрямую строку передавать 🙂
Указанная ниже конструкция возвращает неверный хеш для «asd». Как я понял это связано с кодировками, сообразить как все сделать нормально — я не смог 🙂
Ругается
ругается потому что тип файла — бинарный (stream.Type = 1;), для него нет кодировок, просто последовательность байтов.
Можно попробовать
а вообще я с кириллицей не воевал, это тема отдельных экспериментов )
в 8.3 реализовано на уровне платформы
Показать
Интересно, а есть ограничения на размер строки в 8.3?
Спасибо большое! Очень помогла данная реализация. Перепробовала много алгоритмов, но результат не совпадал с результатом на принимающей файл стороне. Только этот вариант подошел
Что делать тем кто хочет хешировать картинки и выдается ошибка
Ошибка при вызове конструктора (COMОбъект)
crypt = Новый COMОбъект(«CAPICOM.HashedData»);
по причине:
Недопустимая строка с указанием класса
?
(21) Angeros, в системе видимо нет capicom.dll
http://social.technet.microsoft.com/Forums/windows/en-US/b977ef42-7b65-439e-a95b-5d4d204501fd/installing-capicomdll-on-windows-7
Спасибо, если самому не получится реализовать, то качну)))
Но лень, это такая злая штука…))