Blog. Just Blog

Расчет CRC64 на Ассемблере

30.07.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм подсчета CRC64, как и остальных контрольных сумм, предназначен для проверки целостности данных при их передаче или хранении. Также контрольные суммы могут использоваться для быстрого сравнения двух наборов данных на неэквивалентность: с большой вероятностью различные наборы данных будут иметь неравные контрольные суммы. Длина в 64 бита позволяет сократить число возможных коллизий, а использование предварительно посчитанной таблицы делает скорость вычисления достаточно большой.

В этой статье я покажу два варианта алгоритма подсчета CRC64. Они отличаются используемыми полиномами и, соответственно, полученными на их основе таблицами. Сами алгоритмы отличаются ненамного. Первый вариант - прямой или нормальный, принятый как стандарт ISO 3309. Он используется в различных программах, например, в базе данных PostgreSQL. Здесь за основу берется полином 0x42F0E1EBA9EA3693.
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления CRC64 - Прямой табличный алгоритм (PostgreSQL)
  3. ;-----------------------------------------------------------------------
  4. ; Параметры:
  5. ;   lData  - указатель на участок памяти для расчета CRC64
  6. ;   dLen   - размер участка в байтах
  7. ; На выходе:
  8. ;   EAX:EDX = CRC64 участка памяти
  9. ;-----------------------------------------------------------------------
  10. proc calc_CRC64 lData:dword, dLen:dword
  11.         ; Сохранить регистры
  12.         push    edi esi ebx ecx
  13.  
  14.         ; Указатель на данные для подсчета CRC64
  15.         mov     esi,[lData]
  16.         ; Размер участка данных
  17.         mov     ecx,[dLen]
  18.  
  19.         xor     eax,eax
  20.  
  21.         ; Начальное значение CRC64 = -1
  22.         mov     ebx,0FFFFFFFFh
  23.         mov     edx,ebx
  24. @@:
  25.         ; Следующий символ данных
  26.         lodsb
  27.  
  28.         ; Вычислить смещение QWORD в таблице
  29.         mov     edi,edx
  30.         shr     edi,24
  31.         xor     eax,edi
  32.  
  33.         ; Вычислить значение CRC64
  34.         shld    edx,ebx,8
  35.         shl     ebx,8
  36.         xor     ebx,dword [crc64table+eax*8]
  37.         xor     edx,dword [crc64table+eax*8+4]
  38.  
  39.         loop    @b
  40.  
  41.         xchg    eax,ebx
  42.  
  43.         ; Финализация CRC64
  44.         not     eax
  45.         not     edx
  46.  
  47.         ; Восстановить регистры
  48.         pop     ecx ebx esi edi
  49.  
  50.         ret
  51. endp
Эта функция подразумевает, что подсчет контрольной суммы выполняется сразу для всей строки данных, без промежуточных накопительных подсчетов. Если требуется выполнять подсчет для нескольких блоков, например, периодически поступающие потоковые данные или очень большие объемы информации, то алгоритм придется немного модифицировать. Для этого начальное значение CRC64 при втором и последующем расчете инициализируется промежуточным значением с предыдущего подсчета, а финализация выполняется только после вычисления CRC64 последнего блока данных.

Читать статью целиком »
Просмотров: 7325 | Комментариев: 4

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 1 (0.0099 сек.) / Память: 4.5 Mb
Наверх