3_1_7_233

This commit is contained in:
Компания 1С committed 2022-11-17 09:29:00 +03:00
1 parent 63138fe6bd
commit b351585099
78 files changed
+2275 -1116

No files matched your search

@@ -45,6 +45,63 @@
КонецФункции
// Сокращает имя файла с расширением.
// Сокращение имени, производится, когда имя файла с расширением превышает размер 255 байт.
// Сокращение ими файла достигая за счет сокращения имени файла без расширения и
// добавления значения хеш функции сокращенной строки.
//
// Параметры:
// ИмяФайла - Строка - имя файла с расширением
Процедура СократитьИмяФайла(ИмяФайла) Экспорт
#Если ВебКлиент Тогда
Возврат;
#КонецЕсли
ОграничениеВБайтах = 255;
Если РазмерСтрокиВБайтах(ИмяФайла) <= ОграничениеВБайтах Тогда
Возврат;
КонецЕсли;
Файл = Новый Файл(ИмяФайла);
ИмяБезРасширения = Файл.ИмяБезРасширения;
ОграничениеВБайтах = ОграничениеВБайтах - РазмерСтрокиВБайтах(Файл.Расширение);
ДлинаСтроки = СтрДлина(ИмяБезРасширения);
ИспользуемоеКоличествоСимволов = ОграничениеВБайтах - 32;
БольшееКоличествоСимволов = Мин(ДлинаСтроки, ОграничениеВБайтах);
МеньшееКоличествоСимволов = Цел((ОграничениеВБайтах - 32)/4);
Уменьшить = Истина;
Пока Истина Цикл
Если Уменьшить Тогда
ИспользуемоеКоличествоСимволов = МеньшееКоличествоСимволов + Цел((ИспользуемоеКоличествоСимволов-МеньшееКоличествоСимволов)/2);
Иначе
ИспользуемоеКоличествоСимволов = ИспользуемоеКоличествоСимволов + Цел((БольшееКоличествоСимволов - ИспользуемоеКоличествоСимволов)/2);
КонецЕсли;
РазмерСтрокиВБайтах = РазмерСтрокиВБайтах(ИмяБезРасширения)+32;
Если РазмерСтрокиВБайтах = ОграничениеВБайтах Или БольшееКоличествоСимволов - МеньшееКоличествоСимволов = 1 Тогда
Прервать;
КонецЕсли;
Если РазмерСтрокиВБайтах > ОграничениеВБайтах Тогда
Уменьшить = Истина;
БольшееКоличествоСимволов = ИспользуемоеКоличествоСимволов;
Иначе
Уменьшить = Ложь;
МеньшееКоличествоСимволов = ИспользуемоеКоличествоСимволов;
КонецЕсли;
КонецЦикла;
СокращеннаяСтрока = СократитьСтрокуСИпользованиемХеш(ИмяБезРасширения, ИспользуемоеКоличествоСимволов);
ИмяФайла = СокращеннаяСтрока+Файл.Расширение;
КонецПроцедуры
#Область ВнешниеКомпоненты
// Контекст подключения компоненты.
@@ -1230,6 +1287,244 @@
#КонецОбласти
#Область ХешСтрокиПоАлгоритмуMD5
// Возвращает хеш по алгоритму MD5 для произвольной строки.
//
// Параметры:
// Строка - Строка - произвольная строка любой длины
//
// Возвращаемое значение:
// Строка - хеш, вычисленный из строки
////
// Возвращает хеш по алгоритму MD5 для произвольной строки.
//
// Параметры:
// Строка - Строка - произвольная строка любой длины
//
// Возвращаемое значение:
// Строка - хеш, вычисленный из строки
Функция ВычислитьХешСтрокиПоАлгоритмуMD5(Знач Строка)
a = 1732584193; // 01 23 45 67; (шестнадцатеричное представление, сначала младший байт)
b = 4023233417; // 89 AB CD EF;
c = 2562383102; // FE DC BA 98;
d = 271733878; // 76 54 32 10;
X = Новый Массив(16); // X - блок данных размером 512 бит, массив из 32-битных слов
ПустойБайт = ПолучитьДвоичныеДанныеИзHexСтроки("00");
БайтОкончания = ПолучитьДвоичныеДанныеИзHexСтроки("80");
ДвоичныеДанные = ДобавитьКДвоичнымДанным(ПолучитьДвоичныеДанныеИзСтроки(Строка, "UTF-8"), БайтОкончания);
// разбиваем строку на блоки по 512 бит
МассивБлоковИзСтроки = РазделитьДвоичныеДанные(ДвоичныеДанные, 64);
ПоследнийБлок = МассивБлоковИзСтроки[МассивБлоковИзСтроки.ВГраница()];
Пока ПоследнийБлок.Размер() < 64 Цикл
ПоследнийБлок = ДобавитьКДвоичнымДанным(ПоследнийБлок, ПустойБайт);
КонецЦикла;
МассивБлоковИзСтроки[МассивБлоковИзСтроки.ВГраница()] = ПоследнийБлок;
ЧтениеДанных = Новый ЧтениеДанных(ПоследнийБлок);
ЧтениеДанных.Пропустить(55);
Если ЧтениеДанных.ПрочитатьЦелое64() <> 0 Тогда
МассивБлоковИзСтроки.Добавить(0);
КонецЕсли;
// для каждого блока производим расчет
Для НомерБлока = 0 По МассивБлоковИзСтроки.Количество() - 1 Цикл
Блок = МассивБлоковИзСтроки[НомерБлока];
Если Блок = 0 Тогда
X = Новый Массив(16);
Для НомерСлова = 0 По 15 Цикл
X[НомерСлова] = 0;
КонецЦикла;
Иначе
ЧтениеДанных = Новый ЧтениеДанных(Блок);
Для НомерСлова = 0 По 15 Цикл
Если ЧтениеДанных.ЧтениеЗавершено Тогда
X[НомерСлова] = 0;
Иначе
Слово = ЧтениеДанных.ПрочитатьЦелое32();
X[НомерСлова] = ?(Слово = Неопределено, 0, Слово);
КонецЕсли;
КонецЦикла;
КонецЕсли;
// в последний блок дописываем длину строки в битах
Если НомерБлока = МассивБлоковИзСтроки.Количество() - 1 Тогда
РазмерСтрокиВБитах = ПолучитьДвоичныеДанныеИзСтроки(Строка).Размер()* 8;
X[14] = РазмерСтрокиВБитах % Pow(2,32); // сначала младшие 4 байта
X[15] = Цел(РазмерСтрокиВБитах / Pow(2,32)) % Pow(2,64); // если длина превосходит (2^64 - 1) бит, то старшие биты откидываем
КонецЕсли;
РассчитатьБлок(a, b, c, d, X);
КонецЦикла;
Результат = ПолучитьHexСтрокуИзДвоичныхДанных(ЧислоВДвоичныеДанные(a))
+ ПолучитьHexСтрокуИзДвоичныхДанных(ЧислоВДвоичныеДанные(b))
+ ПолучитьHexСтрокуИзДвоичныхДанных(ЧислоВДвоичныеДанные(c))
+ ПолучитьHexСтрокуИзДвоичныхДанных(ЧислоВДвоичныеДанные(d));
Возврат Результат;
КонецФункции
Функция СократитьСтрокуСИпользованиемХеш(Строка, ИспользуемоеКоличествоСимволов)
Результат = Лев(Строка, ИспользуемоеКоличествоСимволов);
Результат = Результат + ВычислитьХешСтрокиПоАлгоритмуMD5(Сред(Строка, ИспользуемоеКоличествоСимволов+1));
Возврат Результат;
КонецФункции
Функция РазмерСтрокиВБайтах(Знач Строка)
Возврат ПолучитьДвоичныеДанныеИзСтроки(Строка, "UTF-8").Размер();
КонецФункции
Процедура РассчитатьБлок(a, b, c, d, X)
aa = a;
bb = b;
cc = c;
dd = d;
// раунд 1
ВыполнитьОперациюСФункциейF(a,b,c,d, X[ 0], 7, 3614090360); // 0xd76aa478 /* 1 */
ВыполнитьОперациюСФункциейF(d,a,b,c, X[ 1], 12, 3905402710); // 0xe8c7b756 /* 2 */
ВыполнитьОперациюСФункциейF(c,d,a,b, X[ 2], 17, 606105819); // 0x242070db /* 3 */
ВыполнитьОперациюСФункциейF(b,c,d,a, X[ 3], 22, 3250441966); // 0xc1bdceee /* 4 */
ВыполнитьОперациюСФункциейF(a,b,c,d, X[ 4], 7, 4118548399); // 0xf57c0faf /* 5 */
ВыполнитьОперациюСФункциейF(d,a,b,c, X[ 5], 12, 1200080426); // 0x4787c62a /* 6 */
ВыполнитьОперациюСФункциейF(c,d,a,b, X[ 6], 17, 2821735955); // 0xa8304613 /* 7 */
ВыполнитьОперациюСФункциейF(b,c,d,a, X[ 7], 22, 4249261313); // 0xfd469501 /* 8 */
ВыполнитьОперациюСФункциейF(a,b,c,d, X[ 8], 7, 1770035416); // 0x698098d8 /* 9 */
ВыполнитьОперациюСФункциейF(d,a,b,c, X[ 9], 12, 2336552879); // 0x8b44f7af /* 10 */
ВыполнитьОперациюСФункциейF(c,d,a,b, X[10], 17, 4294925233); // 0xffff5bb1 /* 11 */
ВыполнитьОперациюСФункциейF(b,c,d,a, X[11], 22, 2304563134); // 0x895cd7be /* 12 */
ВыполнитьОперациюСФункциейF(a,b,c,d, X[12], 7, 1804603682); // 0x6b901122 /* 13 */
ВыполнитьОперациюСФункциейF(d,a,b,c, X[13], 12, 4254626195); // 0xfd987193 /* 14 */
ВыполнитьОперациюСФункциейF(c,d,a,b, X[14], 17, 2792965006); // 0xa679438e /* 15 */
ВыполнитьОперациюСФункциейF(b,c,d,a, X[15], 22, 1236535329); // 0x49b40821 /* 16 */
// раунд 2
ВыполнитьОперациюСФункциейG(a,b,c,d, X[ 1], 5, 4129170786); // 0xf61e2562 /* 17 */
ВыполнитьОперациюСФункциейG(d,a,b,c, X[ 6], 9, 3225465664); // 0xc040b340 /* 18 */
ВыполнитьОперациюСФункциейG(c,d,a,b, X[11], 14, 643717713); // 0x265e5a51 /* 19 */
ВыполнитьОперациюСФункциейG(b,c,d,a, X[ 0], 20, 3921069994); // 0xe9b6c7aa /* 20 */
ВыполнитьОперациюСФункциейG(a,b,c,d, X[ 5], 5, 3593408605); // 0xd62f105d /* 21 */
ВыполнитьОперациюСФункциейG(d,a,b,c, X[10], 9, 38016083); // 0x2441453 /* 22 */
ВыполнитьОперациюСФункциейG(c,d,a,b, X[15], 14, 3634488961); // 0xd8a1e681 /* 23 */
ВыполнитьОперациюСФункциейG(b,c,d,a, X[ 4], 20, 3889429448); // 0xe7d3fbc8 /* 24 */
ВыполнитьОперациюСФункциейG(a,b,c,d, X[ 9], 5, 568446438); // 0x21e1cde6 /* 25 */
ВыполнитьОперациюСФункциейG(d,a,b,c, X[14], 9, 3275163606); // 0xc33707d6 /* 26 */
ВыполнитьОперациюСФункциейG(c,d,a,b, X[ 3], 14, 4107603335); // 0xf4d50d87 /* 27 */
ВыполнитьОперациюСФункциейG(b,c,d,a, X[ 8], 20, 1163531501); // 0x455a14ed /* 28 */
ВыполнитьОперациюСФункциейG(a,b,c,d, X[13], 5, 2850285829); // 0xa9e3e905 /* 29 */
ВыполнитьОперациюСФункциейG(d,a,b,c, X[ 2], 9, 4243563512); // 0xfcefa3f8 /* 30 */
ВыполнитьОперациюСФункциейG(c,d,a,b, X[ 7], 14, 1735328473); // 0x676f02d9 /* 31 */
ВыполнитьОперациюСФункциейG(b,c,d,a, X[12], 20, 2368359562); // 0x8d2a4c8a /* 32 */
// раунд 3
ВыполнитьОперациюСФункциейH(a,b,c,d, X[ 5], 4, 4294588738); // 0xfffa3942 /* 33 */
ВыполнитьОперациюСФункциейH(d,a,b,c, X[ 8], 11, 2272392833); // 0x8771f681 /* 34 */
ВыполнитьОперациюСФункциейH(c,d,a,b, X[11], 16, 1839030562); // 0x6d9d6122 /* 35 */
ВыполнитьОперациюСФункциейH(b,c,d,a, X[14], 23, 4259657740); // 0xfde5380c /* 36 */
ВыполнитьОперациюСФункциейH(a,b,c,d, X[ 1], 4, 2763975236); // 0xa4beea44 /* 37 */
ВыполнитьОперациюСФункциейH(d,a,b,c, X[ 4], 11, 1272893353); // 0x4bdecfa9 /* 38 */
ВыполнитьОперациюСФункциейH(c,d,a,b, X[ 7], 16, 4139469664); // 0xf6bb4b60 /* 39 */
ВыполнитьОперациюСФункциейH(b,c,d,a, X[10], 23, 3200236656); // 0xbebfbc70 /* 40 */
ВыполнитьОперациюСФункциейH(a,b,c,d, X[13], 4, 681279174); // 0x289b7ec6 /* 41 */
ВыполнитьОперациюСФункциейH(d,a,b,c, X[ 0], 11, 3936430074); // 0xeaa127fa /* 42 */
ВыполнитьОперациюСФункциейH(c,d,a,b, X[ 3], 16, 3572445317); // 0xd4ef3085 /* 43 */
ВыполнитьОперациюСФункциейH(b,c,d,a, X[ 6], 23, 76029189); // 0x4881d05 /* 44 */
ВыполнитьОперациюСФункциейH(a,b,c,d, X[ 9], 4, 3654602809); // 0xd9d4d039 /* 45 */
ВыполнитьОперациюСФункциейH(d,a,b,c, X[12], 11, 3873151461); // 0xe6db99e5 /* 46 */
ВыполнитьОперациюСФункциейH(c,d,a,b, X[15], 16, 530742520); // 0x1fa27cf8 /* 47 */
ВыполнитьОперациюСФункциейH(b,c,d,a, X[ 2], 23, 3299628645); // 0xc4ac5665 /* 48 */
// раунд 4
ВыполнитьОперациюСФункциейI(a,b,c,d, X[ 0], 6, 4096336452); // 0xf4292244 /* 49 */
ВыполнитьОперациюСФункциейI(d,a,b,c, X[ 7], 10, 1126891415); // 0x432aff97 /* 50 */
ВыполнитьОперациюСФункциейI(c,d,a,b, X[14], 15, 2878612391); // 0xab9423a7 /* 51 */
ВыполнитьОперациюСФункциейI(b,c,d,a, X[ 5], 21, 4237533241); // 0xfc93a039 /* 52 */
ВыполнитьОперациюСФункциейI(a,b,c,d, X[12], 6, 1700485571); // 0x655b59c3 /* 53 */
ВыполнитьОперациюСФункциейI(d,a,b,c, X[ 3], 10, 2399980690); // 0x8f0ccc92 /* 54 */
ВыполнитьОперациюСФункциейI(c,d,a,b, X[10], 15, 4293915773); // 0xffeff47d /* 55 */
ВыполнитьОперациюСФункциейI(b,c,d,a, X[ 1], 21, 2240044497); // 0x85845dd1 /* 56 */
ВыполнитьОперациюСФункциейI(a,b,c,d, X[ 8], 6, 1873313359); // 0x6fa87e4f /* 57 */
ВыполнитьОперациюСФункциейI(d,a,b,c, X[15], 10, 4264355552); // 0xfe2ce6e0 /* 58 */
ВыполнитьОперациюСФункциейI(c,d,a,b, X[ 6], 15, 2734768916); // 0xa3014314 /* 59 */
ВыполнитьОперациюСФункциейI(b,c,d,a, X[13], 21, 1309151649); // 0x4e0811a1 /* 60 */
ВыполнитьОперациюСФункциейI(a,b,c,d, X[ 4], 6, 4149444226); // 0xf7537e82 /* 61 */
ВыполнитьОперациюСФункциейI(d,a,b,c, X[11], 10, 3174756917); // 0xbd3af235 /* 62 */
ВыполнитьОперациюСФункциейI(c,d,a,b, X[ 2], 15, 718787259); // 0x2ad7d2bb /* 63 */
ВыполнитьОперациюСФункциейI(b,c,d,a, X[ 9], 21, 3951481745); // 0xeb86d391 /* 64 */
a = БинарнаяСумма(a, aa);
b = БинарнаяСумма(b, bb);
c = БинарнаяСумма(c, cc);
d = БинарнаяСумма(d, dd);
КонецПроцедуры
Процедура ВыполнитьОперациюСФункциейF(a, b, c, d, X, s, t)
ВыполнитьОперацию(ПобитовоеИли(ПобитовоеИ(b, c), ПобитовоеИ(ПобитовоеНе(b), d)), a, b, X, s, t);
КонецПроцедуры
Процедура ВыполнитьОперациюСФункциейG(a, b, c, d, X, s, t)
ВыполнитьОперацию(ПобитовоеИли(ПобитовоеИ(b, d), ПобитовоеИ(ПобитовоеНе(d), c)), a, b, X, s, t);
КонецПроцедуры
Процедура ВыполнитьОперациюСФункциейH(a, b, c, d, X, s, t)
ВыполнитьОперацию(ПобитовоеИсключительноеИли(ПобитовоеИсключительноеИли(b, c), d), a, b, X, s, t);
КонецПроцедуры
Процедура ВыполнитьОперациюСФункциейI(a, b, c, d, X, s, t)
ВыполнитьОперацию(ПобитовоеИсключительноеИли(ПобитовоеИли(ПобитовоеНе(d), b), c), a, b, X, s, t);
КонецПроцедуры
Процедура ВыполнитьОперацию(q, a, b, X, s, t)
a = БинарнаяСумма(ЦиклическийСдвигВлево(БинарнаяСумма(БинарнаяСумма(a, q), БинарнаяСумма(X, t)), s), b);
КонецПроцедуры
Функция ЦиклическийСдвигВлево(Число, КоличествоРазрядов)
Результат = Число;
Для НомерРазряда = 1 по КоличествоРазрядов Цикл
Бит = ПроверитьБит(Результат, 31);
Результат = ПобитовыйСдвигВлево(Результат, 1)% Pow(2,32);
Результат = УстановитьБит(Результат, 0, Бит);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ЧислоВДвоичныеДанные(Число)
Поток = Новый ПотокВПамяти(4);
ЗаписьДанных = Новый ЗаписьДанных(Поток);
ЗаписьДанных.ЗаписатьЦелое32(Число);
ЗаписьДанных.Закрыть();
ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Возврат ДвоичныеДанные;
КонецФункции
Функция БинарнаяСумма(Аргумент1, Аргумент2)
Результат = (Аргумент1+Аргумент2)% Pow(2,32);
Возврат Результат;
КонецФункции
Функция ДобавитьКДвоичнымДанным(ДвоичныеДанные, Добавление)
МассивДвоичныхДанных = Новый Массив;
МассивДвоичныхДанных.Добавить(ДвоичныеДанные);
МассивДвоичныхДанных.Добавить(Добавление);
Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
КонецФункции
#КонецОбласти
#Область УстаревшиеПроцедурыИФункции
// Устарела. Используется в ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено.