Добрый вечере. Ни как не могу понять\найти как объединить два CRC. Для наглядности вот пример: Есть например строка '0123456789', найти для ее CRC проще простого. Но если строку разбить на две: '01234' и '56789' и будем считать для каждой этой строки параллельно CRC, в итоге получим два CRC. Как с них получить один CRC = CRC '0123456789'?
Нет можно это точно. Например : Код (ASM): ... mov eax.-1 xor edx,edx @@: crc32 eax,[esi] crc32 edx,[esi+ecx] add esi,4 sub ebx,4 jnz @b ... Потом идет объединение с помощью какой-то отдельной таблицы... Как она генерируется и на основании каких математических принципах это делается так и не могу понять.
К сожалению уже пробовал достичь просветления с этим документом, но для меня он оказался сложноватым.
Но зато другие материалы все таки просветлили меня. Для тех у кого похожие проблемы: Код (ASM): xor ecx,ecx mov eax,-1 xor edx,edx xor ebx,ebx mov esi,xxxx; указатель на данные размером 12 байт crc32 eax,dword[esi] crc32 ecx,dword[esi+4] crc32 edx,dword[esi+8] crc32 eax,ebx crc32 eax,ebx crc32 ecx,ebx xor eax,ecx xor eax,edx not eax В случае размера данных в 24 байта надо будет так сделать: Код (ASM): xor ecx,ecx mov eax,-1 xor edx,edx xor ebx,ebx mov esi,xxxx; указатель на данные размером 24 байт crc32 eax,dword[esi] crc32 ecx,dword[esi+8] crc32 edx,dword[esi+16] add esi,4 crc32 eax,dword[esi] crc32 ecx,dword[esi+8] crc32 edx,dword[esi+16] crc32 eax,ebx crc32 eax,ebx crc32 ecx,ebx crc32 eax,ebx crc32 eax,ebx crc32 ecx,ebx xor eax,ecx xor eax,edx not eax По другому говоря в первом случае мы имеем такую ситуацию: Str1 Str2 Str3=Str1 00 00 xor Str2 00 xor Str3 Во втором случае: Str1Str1 Str2Str2 Str3Str3=Str1 00 00 00 00 xor Str2 00 00 xor Str3 Поэтому если считать CRC32 для заранее известных размеров то можно для этих Str1 00 ... 00 заранее вычислить таблицу.
вот так Код (Text): import zlib d='12345678' c=zlib.crc32(d)&0xFFFFFFFF print hex(c) c=zlib.crc32(d[:4])&0xFFFFFFFF print hex(c) c=zlib.crc32(d[4:],c)&0xFFFFFFFF print hex(c)
ArturMug, Код (Text): TEMP1[31-0] BIT_REFLECT32 (SRC[31-0]) TEMP2[31-0] BIT_REFLECT32 (DEST[31-0]) TEMP3[63-0] TEMP1[31-0] « 32 TEMP4[63-0] TEMP2[31-0] « 32 TEMP5[63-0] TEMP3[63-0] XOR TEMP4[63-0] TEMP6[31-0] TEMP5[63-0] MOD2 11EDC6F41H DEST[31-0] BIT_REFLECT (TEMP6[31-0]) Как понимаю это имелось в виду. Не очень я что то это понимаю - да уже и не важно, разобрался ведь уже как можно объединить с помощью таблицы.
Вот я замеряю скорость исполнения кода для CRC32 и что то не понимаю. Замеряю с помощью rdtsc без каких либо особых ухищрений но все таки результат для меня показался странным вот два кода: Код (ASM): align 4 @@: mov edx,[esi] mov ebx,[esi+4] mov ecx,[esi+8] xor ecx,eax movzx edi,dl mov eax,[edi*4 + CRC32_0x82F63B78 + 1024*3] movzx edi,dh xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*2] shr edx,16 movzx edi,dl xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*1] movzx edi,dh xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*0] movzx edi,bl xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*7] movzx edi,bh xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*6] shr ebx,16 movzx edi,bl xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*5] movzx edi,bh xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*4] movzx edi,cl xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*11] movzx edi,ch xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*10] shr ecx,16 movzx edi,cl xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*9] movzx edi,ch xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*8] add esi,12 sub [!Length],12 jae @b Код (ASM): align 4 @@: mov edx,[esi] mov ebx,[esi+4] mov ecx,[esi+8] movzx ebp,dl movzx edi,bl xor ecx,eax mov eax,[ebp*4 + CRC32_0x82F63B78 + 1024*3] movzx ebp,cl xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*7] movzx edi,dh xor eax,[ebp*4 + CRC32_0x82F63B78 + 1024*11] movzx ebp,bh xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*2] movzx edi,ch xor eax,[ebp*4 + CRC32_0x82F63B78 + 1024*6] shr edx,16 xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*10] shr ebx,16 shr ecx,16 movzx ebp,dl movzx edi,bl xor eax,[ebp*4 + CRC32_0x82F63B78 + 1024*1] movzx ebp,cl xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*5] movzx edi,dh xor eax,[ebp*4 + CRC32_0x82F63B78 + 1024*9] movzx ebp,bh xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*0] movzx edi,ch xor eax,[ebp*4 + CRC32_0x82F63B78 + 1024*4] add esi,12 xor eax,[edi*4 + CRC32_0x82F63B78 + 1024*8] sub [!Length],12 jae @b В теории второй код должен быть быстрей но как показала rdtsc быстрей первый. Может кто подскажет идею, что в втором коде не так? Я ведь старался сделать его менее зависимым, а как показала rdtsc первый код написанный линейно без ухищрений - быстрее, что во втором коде не так?