Иногда возникает необходимость посчитать какую-нибудь контрольную сумму... В зависимости от исходных требований можно использовать различные алгоритмы: CRC8, CRC16, CRC32, MD5, SHA-1 и т.д. Сложность их программной реализации в том, что они требуют оперирования с битами, что в языке 1С не очень удобно... Для простых случаев можно использовать CRC8. Его легко реализовать на языке 1С. Ниже приводится один из вариантов решения. Про оптимальность дискутировать не буду, но на расчет около пяти миллионов кодов с записью их в базу потребовалось не более 10 минут. Что вполне устроило...
// Вычисляет контрольную сумму по алгоритму crc8 для нормального полинома x**8+x**5+x**4+1
// Аргумент и результат - число
Функция CRC8(Числ) Экспорт
ДвСтр = ДвоичнаяСимвольнаяСтрока(Числ); // Переведем в двоичную строку
ДвСтрЛев = ЗаполнитьДо8Знаков(ДвСтр); // Дополним слева до 8 знаков
Длина = СтрДлина(ДвСтрЛев);
ДвСтрЛевПрав = ДвСтрЛев + "00000000"; // Дополним справа, чтобы могли делать XOR
Полином = "00110001"; // Полином в нормальной форме 31h
Результат = "";
Для Позиция = 1 по Длина цикл // цикл по исходной двоичной строке
Если Сред(ДвСтрЛевПрав,Позиция,1) = "1" тогда // Если разряд "1", то XOR с полиномом
а = XOR(Сред(ДвСтрЛевПрав,Позиция+1,8),Полином);
ДвСтрЛевПрав = Лев(ДвСтрЛевПрав,Позиция) + а + Сред(ДвСтрЛевПрав,Позиция+9);
КонецЕсли;
КонецЦикла;
Результат = Прав(ДвСтрЛевПрав,8); // Последние 8 символов - остаток
КонтрЧисл = ЧислоИзДвоичнойСимвольнойСтроки(Результат); // Вернем в число
Возврат(КонтрЧисл);
КонецФункции
// Выполняет операцию "исключающего или" над двумя аргументами в двоичном строковом представлении
// Аргументы и результат - строки длиной 8 символов из "0" и "1"
Функция XOR(А,Б)
Рез = "";
Для с=1 по 8 цикл
Рез = Рез + ?(Сред(А,с,1)=Сред(Б,с,1),"0","1");
КонецЦикла;
Возврат(Рез);
КонецФункции
// Преобразовывает двоичную строку в число
Функция ЧислоИзДвоичнойСимвольнойСтроки(Знач Стр)
Числ = 0;
Длин = СтрДлина(Стр);
Для А=1 по Длин цикл
Числ = Числ + Pow(2,Длин-А)*Число(Сред(Стр,А,1));
КонецЦикла;
Возврат(Числ);
КонецФункции
// Дополняет символьную строку "0" слева до 8 знаков
Функция ЗаполнитьДо8Знаков(Знач Исх)
Пока СтрДлина(Исх) < 8 цикл
Исх = "0" + Исх;
КонецЦикла;
Возврат(Исх);
КонецФункции
// Преобразовывает число в двоичную символьную строку
Функция ДвоичнаяСимвольнаяСтрока(Знач Исх)
Стр = "";
Пока Исх > 0 цикл
Стр = ?((Исх%2)=1,"1","0") + Стр;
Исх = Цел(Исх/2);
КонецЦикла;
Возврат(Стр);
КонецФункции
Для сложных расчетов, например CRC32, MD-5, замечательно подходит вызов MSScriptControl.ScriptControl и передача ему кода на javascript или vbscript. Примеры: http://www.forum.mista.ru/topic.php?id=378975, http://www.forum.mista.ru/topic.php?id=259586, //infostart.ru/public/82506/. Но есть нюансы... Например на MS Server 2008, 64-bit, 8.1 на сервере в режиме внешнего соединения у меня почему-то MSScriptControl.ScriptControl не запускался...
С благодарностью: http://pajhome.org.uk/crypt/md5/index.html