
Алгоритм хеширования MaHash8 на Ассемблере
28.09.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
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
Читать статью целиком »
Просмотров: 465 | Комментариев: 3
