3_1_7_233
This commit is contained in:
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);
|
||||
Возврат Результат;
|
||||
КонецФункции
|
||||
|
||||
Функция ДобавитьКДвоичнымДанным(ДвоичныеДанные, Добавление)
|
||||
МассивДвоичныхДанных = Новый Массив;
|
||||
МассивДвоичныхДанных.Добавить(ДвоичныеДанные);
|
||||
МассивДвоичныхДанных.Добавить(Добавление);
|
||||
Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
|
||||
КонецФункции
|
||||
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
|
||||
#Область УстаревшиеПроцедурыИФункции
|
||||
|
||||
// Устарела. Используется в ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено.
|
||||
|
||||
Reference in new issue
Block a user