Имя: Пароль:
1C
 
OFF: Расчет контрольной суммы строки средствами 1С (3)
0 skunk
 
10.12.05
09:00
продолжение темы Расчет контрольной суммы строки средствами 1С

Ламо обнаружил, что алгоритм Снипа по расчету CRC (опубликованому здесь http://gr13.net.ru/old/1c/crc32.htm ) работает не верно... сводит к нулю  CRC к нулю... дублирует его... послал снипу... но он умер... а сегодня поковырял его и обнаружил каки...

патчить надо следующие функции... CRC32 и CRCString

реализация Снипа...
function CRC32(val Arg1, Arg2)
 Arg2 = (Xor(HexToBin(arCRC[Byte(Xor(Arg2, DecToBin(Arg1, "")))]),
         AndB(Shr(Arg1, 8), "00000000111111111111111111111111")));
 return Arg2;
endfunction

function CRCString(val Arg1)
 EndStr = strlen(Arg1);
 Arg2 = "FFFFFFFF";
 for i = 1 to EndStr do
   Arg2 = CRC32(asc(mid(Arg1, i, 1)) + 1, Arg2);
 enddo;
 return BinToHex(Arg2);
endfunction



патч
function CRC32(val Arg1, Arg2)
 Arg1 = DecToBin(Arg1);
 Arg2 = (Xor(HexToBin(arCRC[Byte(Xor(Arg2, DecToBin(Arg1, "")))]),
         AndB(Shr(Arg2, 8), "00000000111111111111111111111111")));
 return Arg2;
endfunction

function CRCString(val Arg1)
 EndStr = strlen(Arg1);
 Arg2 = HexToBin("FFFFFFFF"); // или Arg2 = "11111111111111111111111111111111";
 for i = 1 to EndStr do
   Arg2 = CRC32(asc(mid(Arg1, i, 1)) + 1, Arg2);
 enddo;
 return BinToHex(Arg2);
endfunction
1 LandCruiser
 
10.12.05
09:01
привет скунк!!!! щас попробую.
2 skunk
 
10.12.05
09:05
(1)привет... а я твое мыло ищу... что бы выслать...
3 LandCruiser
 
10.12.05
09:08
это, скунк. тупой вопрос у меня. что там за функция Longint  в DecToBin. Обойти конечно можно, но все равно неприятно
4 skunk
 
10.12.05
09:15
(3) еще косяк Снипа... просто я гонял на его обработке ... давно исправил

Снипа
function DecToBin(val Arg1, Arg2)
 if Arg1 < 2 then
   Arg2 = right("00000000000000000000000000000000" + (string(Arg1) + Arg2), 32);
 else
   Arg2 = LongInt(int(Arg1/2), ?(int(Arg1/2) = (Arg1/2), "0", "1") + Arg2);
 endif;
 return Arg2;
endfunction

патч

function DecToBin(val Arg1, Arg2 = "")
 if Arg1 < 2 then
   Arg2 = right("00000000000000000000000000000000" + (string(Arg1) + Arg2), 32);
 else
   Arg2 = DecToBin(int(Arg1/2), ?(int(Arg1/2) = (Arg1/2), "0", "1") + Arg2);
 endif;
 return Arg2;
endfunction
5 skunk
 
10.12.05
09:26
плять теперь я прогнал ...

CRC32 правильно так...
function CRC32(val Arg1, Arg2)
 Arg2 = (Xor(HexToBin(arCRC[Byte(Xor(Arg2, DecToBin(Arg1, "")))]),
         AndB(Shr(Arg2, 8), "00000000111111111111111111111111")));
 return Arg2;
endfunction
6 LandCruiser
 
10.12.05
09:27
(0,4) спаисибо за внимание. но все же я хочу Zorbist key попробывать. там побыстрее должно фурычить чем CRC.
7 LandCruiser
 
10.12.05
09:28
(5) не надо скунк. она долго работает
8 skunk
 
10.12.05
09:29
(6)может потом как нить... сперва ОЛЯ... )))
9 LandCruiser
 
10.12.05
09:29
(8) и Вера ;)
10 skunk
 
10.12.05
09:31
ОЛЯ для Веры... ;))


ее можно намного ушустрить если весь масив сразу в двоичном виде прогнать...
11 LandCruiser
 
10.12.05
09:33
(10) делал в двоичном. Zorbist key обещает быть быстрее. там операций меньше.
Оля для Веры -романтично...
12 skunk
 
10.12.05
09:35
(11)я его еще даже не глядел... так в помойку бросил... для разбора...
13 Демогоргон
 
10.12.05
10:38
(0) Где траву брал?
14 LandCruiser
 
10.12.05
10:40
(14) ты чего. какая трава. реальная задача. я бы без этой фигни другую фигню бы не зделал.
15 skunk
 
10.12.05
10:43
(13)я не брал... я до куривал...
16 skunk
 
10.12.05
10:49
17 Демогоргон
 
10.12.05
10:53
(16) а ...
18 LandCruiser
 
10.12.05
10:54
(17) б..
19 Демогоргон
 
10.12.05
10:54
Не на самом деле алгоритмов много есть - тока они все не очень рулят на коротких строках
20 skunk
 
10.12.05
10:57
(19)ни кто не предложил... Снип показал этот... правда с ошипками... вот NS про зорбит кей сказал... и пока все...
21 LandCruiser
 
10.12.05
11:00
+20 базара нет. все мы не по-детски круты на этом форуме.
22 skunk
 
10.12.05
11:02
крутые только яйца... да и то когда их сварят
23 NS
 
10.12.05
11:03
(20) Зибрист кей реализуется очень просто. Только применительно к 1С битовые операции, как я уже говорил - проще заменить сложением (по модулю)
24 skunk
 
10.12.05
11:04
shr можно умножением....
25 NS
 
10.12.05
11:05
Сейчас напишу (через полчасика)
(24) Медленно будут работать все эти реализации битовых операций.
26 LandCruiser
 
10.12.05
11:06
все равно будет быстрее чем CRC.
27 Демогоргон
 
10.12.05
11:20
(20) алгиритмов в инете завались. Прсто завалсиь. Там даже зип есть :) Хафманна рассматривается так-же очень часто. Прост оих описывтаь - себе дороже. И что-бы ещ и БД ужать - да ну... В Оракле и МайСкл - ле там это есть :) (вроде как бы, точно не помню) а если это не ассмом или сишкой делается - это тормоз жуткий. Ты бушь ждать пока у тя справочник откроется? минут 5 пройдет если справочник большой. Если чиста теоритически интересна то пеши уж на с или на ассме ;)
28 skunk
 
10.12.05
11:23
(27)я его и писал на асаме... снип сделал локализацию на одиСи... и все...
29 NS
 
10.12.05
11:46
перем randseed;
перем а[100000];
// Для того, чтоб ускорить расчет
// Когда расчет не разовый
Функция random()    
   randSeed=(randSeed*1103515245+12345)%2147483648;
   //  возврат randSeed/2147483648;
КонецФункции  
Процедура Инициализация()
   перем к;
   randseed=172863748;
   Для к=1 по 100000 цикл
       random();
       Если randseed=0 тогда
           random();
       КонецЕсли;
       а[к]=randseed;
   Конеццикла;    
КонецПроцедуры    
Функция ПолучитьCRC(стр)
   перем к;
   CRC=0;
   Для к=1 по стрдлина(стр) цикл  
       код=кодсимв(сред(стр,к,1));
       CRC=(CRC+а[(к-1)*255+код])%1000000000;  
       // код<>0, ежели снулем, то +1, и *256
   КонецЦикла;    
   возврат CRC;
КонецФункции    
Процедура Сформировать()  
   перем к,к1;  
   СЗ=создатьобъект("СписокЗначений");
   Инициализация();
   Сообщить(ПолучитьCRC("Мама мыла раму"));              
   Сообщить(ПолучитьCRC("Полет над гнездом кукушки"));
   сообщить(ТекущееВремя());
   Для  к=1 по 255 цикл  
       //состояние(к);
       Для к1=1 по 255 цикл
           //    Сообщить(ПолучитьCRC(симв(к)+симв(к1)));
           зн=ПолучитьCRC(симв(к)+симв(к1));
           //Если СЗ.найтиЗначение(зн)=1 тогда
           //    сообщить("Беда");
           //КонецЕсли;    
           //Сз.ДобавитьЗначение(зн);
       КонецЦикла;
   КонецЦикла;              
   сообщить(ТекущееВремя());
   сообщить("Сделано "+255*255+" итераций");
КонецПроцедуры
30 skunk
 
10.12.05
11:49
29 хм... забавно... а массив а[]  ... тот же...
31 NS
 
10.12.05
11:50
Процедура Инициализация()
   перем к;
   randseed=172863748;
   Для к=1 по 100000 цикл
       random();
       Если randseed%1000=0 тогда
           random();
       КонецЕсли;
       а[к]=randseed;
   Конеццикла;    
КонецПроцедуры    
Так будет лучше.
Массив - просто для скорости - на лету рассчитывать медленно.
32 skunk
 
10.12.05
11:54
(31)все втыкнул... спасибо ;))
33 NS
 
10.12.05
12:02
Функция ПолучитьCRC(стр)
   перем к,м;
   CRC=0;  
   м=0;
   Для к=1 по стрдлина(стр) цикл  
       CRC=CRC+а[м+кодсимв(сред(стр,к,1))];  
       м=м+255;
   КонецЦикла;    
   возврат CRC%1000000000;
КонецФункции    
//а вот так будет побыстрее...
34 skunk
 
10.12.05
12:08
потом на досуге по скорости погоняю...
35 NS
 
10.12.05
12:09
зн=ПолучитьCRC(симв(к)+симв(к1));
Если СЗ.найтиЗначение(зн)<>0 тогда
 сообщить("Беда");
КонецЕсли;    
Сз.ДобавитьЗначение(зн);
// вот так конечно.
36 NS
 
10.12.05
12:31
Процедура Инициализация()
   перем к;
   randseed=172863748;
   Для к=1 по 100000 цикл
       random();
       Если randseed%4096=0 тогда
           random();
       КонецЕсли;
       а[к]=randseed;
   Конеццикла;    
КонецПроцедуры    
Функция ПолучитьCRC(стр)
   перем к,м;
   CRC=0;  
   м=0;
   Для к=1 по стрдлина(стр) цикл  
       CRC=CRC+а[м+кодсимв(сред(стр,к,1))];  
       м=м+255;
   КонецЦикла;    
   возврат _IdToStr(CRC%2147483648);
КонецФункции
// ну - короче в этом духе.
// чтоб получить большую надежность - нужен другой генератор СЧ.
37 NS
 
10.12.05
12:34
(+36) Наврал, можно и с этим получить большую надежность...
Но вроде и так достаточно.
38 skunk
 
10.12.05
12:34
(36)вот ты Серега не угомоный )))
39 NS
 
10.12.05
12:39
Процедура Инициализация()
   перем к;
   randseed=172863748;
   Для к=1 по 100000 цикл
       random();
       а[к]=randseed;
       random();
       а[к]=а[к]*2147483648+randseed;
   Конеццикла;    
КонецПроцедуры    
Функция ПолучитьCRC(стр)
   перем к,м;
   CRC=0;  
   м=0;
   Для к=1 по стрдлина(стр) цикл  
       CRC=CRC+а[м+кодсимв(сред(стр,к,1))];  
       м=м+255;
   КонецЦикла;    
   сообщить(CRC);
   возврат CRC%4611686018427387904;
КонецФункции    
// А что мне делать?
// мне одному у клиента скушно...
40 skunk
 
10.12.05
12:51
а мне сейчас торт принесут... правда без варенья...
41 NS
 
10.12.05
12:53
(40) Блин совсем один сижу. Йёгурт есть и кофе, а народу никого...
Некому даже торт принести. Клиент базу на дом не дал.
Если бы пьющий был - хряпнул бы бутылочку пивка. А так - скукотень...
42 skunk
 
10.12.05
12:57
(41)я тоже не пью... точнее пью... но только сок... вчера хотел нажраться, а потом передумал чего-то
43 LandCruiser
 
10.12.05
13:34
ого. понаписали. скунк-это быстрее, даже думать нечего
44 skunk
 
10.12.05
13:35
(43)я так... от скуки...
45 NS
 
10.12.05
13:35
(43) А у тебя какая длина строк, которые хешировать надо?
46 LandCruiser
 
10.12.05
13:37
80-90 символов. у скунка есть текст.
47 skunk
 
10.12.05
13:37
у него 80 символов...
48 NS
 
10.12.05
13:40
(46) Тогда массив можно поменьше делать - тонн на 30 элементов.
Быстрее зобриста нормальных алгоритмов нет соотношение скорость/надежность - отличное. Все сильнейшие шахматные программы для хеширования позиций используют 64-битный зобрист - а там в хеше - до миллиардов позиций... И без дублей...
49 LandCruiser
 
10.12.05
13:50
(48) впечатляет..по скорости-тоже.. конкретно у меня можно еще меньше чем 30000 - нужно уникальные суммы проставить ну для пары сотен строк. но быстро-это критично.
50 NS
 
10.12.05
14:32
Для пары сотен строк - десятизначного кода - "просто выше крыши"
30000 - это число зависит от длины строки, а не от количества уникальных строк.
Тебе нужен именно числовой код - или лучше приведенный к строке?
51 LandCruiser
 
10.12.05
14:36
(50) мне нужно знать изменяли ли строку за последние ну скажем 3-5 минут
52 NS
 
10.12.05
14:36
(51) А почему её саму нельзя хранить?
53 Guk
 
10.12.05
14:37
(50) Я придумал, как обойти мою проблему, кстати...
54 LandCruiser
 
10.12.05
14:40
(52) а она вся нафиг не нужна-раз.
два- за день их(строк) порядка 2000-3000. ну за месяц и так далее их конечно еще больше. и они уже хранятся. все что нужно знать-меняли ее или нет.
55 NS
 
10.12.05
14:43
(54) Понятно.
(53) поиск по полному коду? ;-))
56 LandCruiser
 
10.12.05
14:57
(55)спасибо за инфу кстати, очень помогло
57 Guk
 
10.12.05
15:06
(53) Нет, круче...
58 LandCruiser
 
10.12.05
15:08
(57)серьезная проблема? поделись пищей для ума.
59 Guk
 
10.12.05
15:12
(58) Поиск по родителю. Если в спарочнике больше уровней, чем 2, не работает НайтиПоКоду для элемента. Если использовать родителя первого уровня...
60 LandCruiser
 
10.12.05
15:14
(59)первый раз слышу. мля, гадом буду у меня в 4-х уровнях ни разу не слетало. а ищет часто..
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.