CRC32 как обьеденить два результата?

Тема в разделе "WASM.BEGINNERS", создана пользователем hapr, 7 фев 2018.

Метки:
  1. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    59
    Добрый вечере.
    Ни как не могу понять\найти как объединить два CRC. Для наглядности вот пример:
    Есть например строка '0123456789', найти для ее CRC проще простого. Но если строку разбить на две:
    '01234' и '56789' и будем считать для каждой этой строки параллельно CRC, в итоге получим два CRC.
    Как с них получить один CRC = CRC '0123456789'?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    никак.
     
  3. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    59
    Нет можно это точно.
    Например :
    Код (ASM):
    1. ...
    2. mov eax.-1
    3. xor edx,edx
    4.  
    5. @@:
    6. crc32 eax,[esi]
    7. crc32 edx,[esi+ecx]
    8. add  esi,4
    9. sub  ebx,4
    10. jnz @b
    11. ...
    12.  
    Потом идет объединение с помощью какой-то отдельной таблицы...
    Как она генерируется и на основании каких математических принципах это делается так и не могу понять.
     
  4. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
  5. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    59
  6. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    59
    Но зато другие материалы все таки просветлили меня. Для тех у кого похожие проблемы:

    Код (ASM):
    1.              
    2.               xor ecx,ecx
    3.  
    4.                mov eax,-1
    5.  
    6.                xor edx,edx
    7.  
    8.                xor ebx,ebx
    9.  
    10.                mov esi,xxxx; указатель на данные размером 12 байт
    11.  
    12.  
    13.  
    14.                crc32 eax,dword[esi]
    15.  
    16.                crc32 ecx,dword[esi+4]
    17.  
    18.                crc32 edx,dword[esi+8]
    19.  
    20.               crc32 eax,ebx
    21.  
    22.               crc32 eax,ebx
    23.  
    24.               crc32 ecx,ebx
    25.  
    26.               xor eax,ecx
    27.  
    28.               xor eax,edx
    29.  
    30.               not eax  
    В случае размера данных в 24 байта надо будет так сделать:
    Код (ASM):
    1.              
    2.               xor ecx,ecx
    3.  
    4.                mov eax,-1
    5.  
    6.                xor edx,edx
    7.  
    8.                xor ebx,ebx
    9.  
    10.                mov esi,xxxx; указатель на данные размером 24 байт
    11.  
    12.  
    13.  
    14.                crc32 eax,dword[esi]
    15.  
    16.                crc32 ecx,dword[esi+8]
    17.  
    18.                crc32 edx,dword[esi+16]
    19.  
    20.                add esi,4
    21.  
    22.                crc32 eax,dword[esi]
    23.  
    24.                crc32 ecx,dword[esi+8]
    25.  
    26.                crc32 edx,dword[esi+16]
    27.  
    28.               crc32 eax,ebx
    29.  
    30.               crc32 eax,ebx
    31.  
    32.               crc32 ecx,ebx
    33.  
    34.               crc32 eax,ebx
    35.  
    36.               crc32 eax,ebx
    37.  
    38.               crc32 ecx,ebx
    39.  
    40.               xor eax,ecx
    41.  
    42.               xor eax,edx
    43.  
    44.               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 заранее вычислить таблицу.
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    hapr,

    Есть ведь подробное описание с псевдокодом в базовой документации. IA Vol. 2A 3-221.
     
  8. ArturMug

    ArturMug New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2018
    Сообщения:
    1
    вот так
    Код (Text):
    1. import zlib
    2.  
    3.  
    4. d='12345678'
    5. c=zlib.crc32(d)&0xFFFFFFFF
    6. print hex(c)
    7.  
    8. c=zlib.crc32(d[:4])&0xFFFFFFFF
    9. print hex(c)
    10.  
    11. c=zlib.crc32(d[4:],c)&0xFFFFFFFF
    12. print hex(c)
    13.  
     
  9. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    59
    ArturMug,
    Код (Text):
    1. TEMP1[31-0]  BIT_REFLECT32 (SRC[31-0])
    2. TEMP2[31-0]  BIT_REFLECT32 (DEST[31-0])
    3. TEMP3[63-0]  TEMP1[31-0] « 32
    4. TEMP4[63-0]  TEMP2[31-0] « 32
    5. TEMP5[63-0]  TEMP3[63-0] XOR TEMP4[63-0]
    6. TEMP6[31-0]  TEMP5[63-0] MOD2 11EDC6F41H
    7. DEST[31-0]  BIT_REFLECT (TEMP6[31-0])
    8.  
    Как понимаю это имелось в виду. Не очень я что то это понимаю - да уже и не важно, разобрался ведь уже как можно объединить с помощью таблицы.
     
  10. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    59
    Вот я замеряю скорость исполнения кода для CRC32 и что то не понимаю. Замеряю с помощью rdtsc без каких либо особых ухищрений но все таки результат для меня показался странным вот два кода:
    Код (ASM):
    1.           align  4
    2.             @@:
    3.             mov  edx,[esi]
    4.             mov  ebx,[esi+4]
    5.             mov  ecx,[esi+8]
    6.             xor  ecx,eax
    7.  
    8.           movzx  edi,dl
    9.             mov  eax,[edi*4 + CRC32_0x82F63B78 + 1024*3]
    10.           movzx  edi,dh
    11.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*2]
    12.             shr  edx,16
    13.           movzx  edi,dl
    14.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*1]
    15.           movzx  edi,dh
    16.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*0]
    17.  
    18.           movzx  edi,bl
    19.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*7]
    20.           movzx  edi,bh
    21.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*6]
    22.             shr  ebx,16
    23.           movzx  edi,bl
    24.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*5]
    25.           movzx  edi,bh
    26.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*4]
    27.  
    28.           movzx  edi,cl
    29.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*11]
    30.           movzx  edi,ch
    31.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*10]
    32.  
    33.             shr  ecx,16
    34.  
    35.           movzx  edi,cl
    36.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*9]
    37.           movzx  edi,ch
    38.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*8]
    39.  
    40.             add  esi,12
    41.             sub  [!Length],12
    42.             jae  @b    
    Код (ASM):
    1.           align  4
    2.             @@:
    3.             mov  edx,[esi]
    4.             mov  ebx,[esi+4]
    5.             mov  ecx,[esi+8]
    6.  
    7.           movzx  ebp,dl
    8.           movzx  edi,bl
    9.             xor  ecx,eax
    10.             mov  eax,[ebp*4 + CRC32_0x82F63B78 + 1024*3]
    11.           movzx  ebp,cl
    12.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*7]
    13.           movzx  edi,dh
    14.             xor  eax,[ebp*4 + CRC32_0x82F63B78 + 1024*11]
    15.           movzx  ebp,bh
    16.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*2]
    17.           movzx  edi,ch
    18.             xor  eax,[ebp*4 + CRC32_0x82F63B78 + 1024*6]
    19.             shr  edx,16
    20.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*10]
    21.             shr  ebx,16
    22.             shr  ecx,16
    23.  
    24.           movzx  ebp,dl
    25.           movzx  edi,bl
    26.             xor  eax,[ebp*4 + CRC32_0x82F63B78 + 1024*1]
    27.           movzx  ebp,cl
    28.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*5]
    29.           movzx  edi,dh
    30.             xor  eax,[ebp*4 + CRC32_0x82F63B78 + 1024*9]
    31.           movzx  ebp,bh
    32.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*0]
    33.           movzx  edi,ch
    34.             xor  eax,[ebp*4 + CRC32_0x82F63B78 + 1024*4]
    35.             add  esi,12
    36.             xor  eax,[edi*4 + CRC32_0x82F63B78 + 1024*8]
    37.  
    38.  
    39.             sub  [!Length],12
    40.             jae  @b    
    В теории второй код должен быть быстрей но как показала rdtsc быстрей первый.
    Может кто подскажет идею, что в втором коде не так? Я ведь старался сделать его менее зависимым, а как показала rdtsc первый код написанный линейно без ухищрений - быстрее, что во втором коде не так?