![]() |
![]() |
![]() |
|
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
|
+15 началнали там... Как уменьшить строку в 50 символов до 20 символов?
|
|||
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-х уровнях ни разу не слетало. а ищет часто..
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |