
Алгоритм хеширования MaHash8 на Ассемблере

Алгоритм хеширования MaHash8 на Ассемблере
MaHash8 - эффективная функция с высокой производительностью, которая позволяет выполнять операции хеширования с минимальным количеством коллизий. Она основана на простых операциях, имеет очень понятную структуру и легко реализуется на различных языках программирования.
В алгоритме MaHash8 для хеширования используется таблица подстановки, позаимствованная из криптоалгоритма Skipjack. Если не хотите таскать готовую таблицу, то ее можно создавать динамически, используя формулы по приведенной ссылке.
Code (Assembler) : Убрать нумерацию
- sTable db 0a3h,0d7h,009h,083h,0f8h,048h,0f6h,0f4h,0b3h,021h,015h,078h
- db 099h,0b1h,0afh,0f9h,0e7h,02dh,04dh,08ah,0ceh,04ch,0cah,02eh
- db 052h,095h,0d9h,01eh,04eh,038h,044h,028h,00ah,0dfh,002h,0a0h
- db 017h,0f1h,060h,068h,012h,0b7h,07ah,0c3h,0e9h,0fah,03dh,053h
- db 096h,084h,06bh,0bah,0f2h,063h,09ah,019h,07ch,0aeh,0e5h,0f5h
- db 0f7h,016h,06ah,0a2h,039h,0b6h,07bh,00fh,0c1h,093h,081h,01bh
- db 0eeh,0b4h,01ah,0eah,0d0h,091h,02fh,0b8h,055h,0b9h,0dah,085h
- db 03fh,041h,0bfh,0e0h,05ah,058h,080h,05fh,066h,00bh,0d8h,090h
- db 035h,0d5h,0c0h,0a7h,033h,006h,065h,069h,045h,000h,094h,056h
- db 06dh,098h,09bh,076h,097h,0fch,0b2h,0c2h,0b0h,0feh,0dbh,020h
- db 0e1h,0ebh,0d6h,0e4h,0ddh,047h,04ah,01dh,042h,0edh,09eh,06eh
- db 049h,03ch,0cdh,043h,027h,0d2h,007h,0d4h,0deh,0c7h,067h,018h
- db 089h,0cbh,030h,01fh,08dh,0c6h,08fh,0aah,0c8h,074h,0dch,0c9h
- db 05dh,05ch,031h,0a4h,070h,088h,061h,02ch,09fh,00dh,02bh,087h
- db 050h,082h,054h,064h,026h,07dh,003h,040h,034h,04bh,01ch,073h
- db 0d1h,0c4h,0fdh,03bh,0cch,0fbh,07fh,0abh,0e6h,03eh,05bh,0a5h
- db 0adh,004h,023h,09ch,014h,051h,022h,0f0h,029h,079h,071h,07eh
- db 0ffh,08ch,00eh,0e2h,00ch,0efh,0bch,072h,075h,06fh,037h,0a1h
- db 0ech,0d3h,08eh,062h,08bh,086h,010h,0e8h,008h,077h,011h,0beh
- db 092h,04fh,024h,0c5h,032h,036h,09dh,0cfh,0f3h,0a6h,0bbh,0ach
- db 05eh,06ch,0a9h,013h,057h,025h,0b5h,0e3h,0bdh,0a8h,03ah,001h
- db 005h,059h,02ah,046h
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция вычисления хеша MaHash8
- ; Автор: ManHunter / PCL
- ; https://www.manhunter.ru
- ;-----------------------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ; На выходе:
- ; EAX = полученный хеш
- ;-----------------------------------------------------------------------
- proc MaHash8 lpData:DWORD, dSize:DWORD
- locals
- hash1 dd ?
- hash2 dd ?
- endl
- push ebx ecx edx esi edi
- mov esi,[lpData]
- mov eax,[dSize]
- mov [hash1],eax
- mov [hash2],eax
- xor ecx,ecx
- .loc_loop:
- cmp ecx,[dSize]
- je .loc_done
- mov al,byte[esi]
- add eax,ecx
- movzx eax,al
- movzx edx,byte[sTable+eax]
- add [hash1],edx
- mov edx,[hash1]
- shl edx,6
- mov eax,[hash1]
- shr eax,11
- xor eax,edx
- add eax,[hash1]
- rol eax,14
- mov [hash1],eax
- lodsb
- add eax,ecx
- movzx eax,al
- movzx edx,byte[sTable+eax]
- add [hash2],edx
- mov edx,[hash2]
- shl edx,6
- mov eax,[hash2]
- shr eax,11
- xor eax,edx
- add eax,[hash2]
- rol eax,18
- mov [hash2],eax
- mov ebx,[hash1]
- mov edi,[hash2]
- mov eax,ebx
- shr eax,16
- movzx edx,ax
- mov eax,edi
- shl eax,16
- or eax,edx
- mov [hash1],eax
- mov eax,edi
- shr eax,16
- movzx edx,ax
- mov eax,ebx
- shl eax,16
- or eax,edx
- mov [hash2],eax
- inc ecx
- jmp .loc_loop
- .loc_done:
- mov eax,[hash2]
- xor eax,[hash1]
- pop edi esi edx ecx ebx
- ret
- endp
Еще более надежный вариант функции MaHash8v64, как можно догадаться из названия, выдает 64-битный хеш. Алгоритм расчета в точности совпадает с предыдущей функцией, разница только в том, что для формирования финального результата два 32-битных суб-хеша не сжимаются в один DWORD, а возвращаются каждый как самостоятельная часть хеша.
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция вычисления хеша MaHash8v64
- ; Автор: ManHunter / PCL
- ; https://www.manhunter.ru
- ;-----------------------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ; На выходе:
- ; EAX:EDX = полученный хеш
- ;-----------------------------------------------------------------------
- proc MaHash8v64 lpData:DWORD, dSize:DWORD
- locals
- hash1 dd ?
- hash2 dd ?
- endl
- push ebx ecx esi edi
- mov esi,[lpData]
- mov eax,[dSize]
- mov [hash1],eax
- mov [hash2],eax
- xor ecx,ecx
- .loc_loop:
- cmp ecx,[dSize]
- je .loc_done
- mov al,byte[esi]
- add eax,ecx
- movzx eax,al
- movzx edx,byte[sTable+eax]
- add [hash1],edx
- mov edx,[hash1]
- shl edx,6
- mov eax,[hash1]
- shr eax,11
- xor eax,edx
- add eax,[hash1]
- rol eax,14
- mov [hash1],eax
- lodsb
- add eax,ecx
- movzx eax,al
- movzx edx,byte[sTable+eax]
- add [hash2],edx
- mov edx,[hash2]
- shl edx,6
- mov eax,[hash2]
- shr eax,11
- xor eax,edx
- add eax,[hash2]
- rol eax,18
- mov [hash2],eax
- mov ebx,[hash1]
- mov edi,[hash2]
- mov eax,ebx
- shr eax,16
- movzx edx,ax
- mov eax,edi
- shl eax,16
- or eax,edx
- mov [hash1],eax
- mov eax,edi
- shr eax,16
- movzx edx,ax
- mov eax,ebx
- shl eax,16
- or eax,edx
- mov [hash2],eax
- inc ecx
- jmp .loc_loop
- .loc_done:
- mov eax,[hash1]
- mov edx,[hash2]
- pop edi esi ecx ebx
- ret
- endp
В приложении примеры программ с исходными текстами, реализующие вычисление хеша по алгоритму MaHash8 и MaHash8v64.
Просмотров: 666 | Комментариев: 3
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(22.10.2024 в 01:01):
Ну как сказать.. Если учесть, что CRC32 реализовано уже на уровне базовых команд современных процессоров, то в глобальном масштабе, скорее всего, этот алгоритм проиграет. Но если опять же учесть современные мощности процессоров, то подобные микро-нано-секунды в реальных проектах вряд ли будут иметь прям капец какое принципиальное значение. А вот когда речь зайдет о практическом применении в прошивках микропроцессоров, где важен каждый байт, то вопрос выбора может иметь место.
В конце концов, кто мешает засечь время и прохешировать стопицот раз какой-нибудь HD-видосик на 40-50 гигов?
Кстати, по коллизиям этот алго вполне сопоставим с CRC32.
В конце концов, кто мешает засечь время и прохешировать стопицот раз какой-нибудь HD-видосик на 40-50 гигов?
Кстати, по коллизиям этот алго вполне сопоставим с CRC32.
Zeroes
(22.10.2024 в 00:50):
А нет сравнения скорости расчёта по сравнению например с CRC32? в инете сходу не нашёл :)
Добавить комментарий
Заполните форму для добавления комментария
Примеры программ с исходными текстами (FASM)


Такое может работать только если нужно подогнать хеш-функцию к конкретным входным данным (например языку текста https://doxygen.reactos.org/d7..._source.html ), но для универсальной хеш-функции это бессмысленно.