С Новым Годом! С Новым Годом!
Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм хеширования ElfHash на Ассемблере
Алгоритм хеширования ElfHash на Ассемблере

ElfHash - это хеш-функция, используемая в формате ELF (Executable and Linkable Format), основном формате исполняемых файлов, объектных файлов и разделяемых библиотек в Unix-подобных системах. Конкретно эта функция применяется для хеширования имен символов (функций, переменных) в хеш-таблицах символьных таблиц ELF-файлов. Этот алгоритм представляет собой элегантный компромисс между скоростью, качеством распределения и простотой реализации, что объясняет его долголетие в экосистеме Unix/Linux.

Функция ElfHash была разработана для System V Application Binary Interface и впервые появилась в AT&T Unix System V Release 4. Она стала стандартом для хеширования имен символов в ELF-файлах и до сих пор используется, например, инструментах анализа бинарных файлов и программах Linux. Несмотря появление более совершенных хеш-функций, ElfHash продолжает использоваться из-за обратной совместимости существующих ELF-файлав.
  1. ;---------------------------------------------
  2. ; Функция вычисления хеша ElfHash
  3. ;
  4. ; Параметры:
  5. ;      lpData - указатель на строку
  6. ;      dSize  - длина строки
  7. ; На выходе:
  8. ;       EAX = полученный хеш
  9. ;---------------------------------------------
  10. proc    ElfHash lpData:DWORD, dSize:DWORD
  11.         push    ebx edx esi edi
  12.  
  13.         mov     esi,[lpData]
  14.         mov     edi,[dSize]
  15.         xor     eax,eax
  16.         xor     edx,edx
  17. .loc_loop:
  18.         cmp     edi,0
  19.         jz      .loc_ret
  20.  
  21.         ; Сдвиг и добавление нового символа
  22.         movzx   ebx,byte [esi]
  23.         shl     eax,4
  24.         add     eax,ebx
  25.  
  26.         ; Проверка переполнения
  27.         mov     edx,eax
  28.         and     edx,0xF0000000
  29.         jz      .next_fast
  30.  
  31.         ; "Перемешивание" при переполнении
  32.         mov     ebx,edx
  33.         shr     ebx,24
  34.         xor     eax,ebx
  35. .next_fast:
  36.         ; Обнуление старших бит
  37.         not     edx
  38.         and     eax,edx
  39.  
  40.         inc     esi
  41.         dec     edi
  42.         jmp     .loc_loop
  43.  
  44.         ; Финальное 32-битное хеш-значение
  45. .loc_ret:
  46.         pop     edi esi edx ebx
  47.         ret
  48. endp
Функция принимает два параметра: указатель на данные и их размер. На выходе возвращается значение хеша в виде DWORD. Коллизии возможны, как и в любой хеш-функции.

В приложении пример программы с исходным текстом, которая считает хеш ElfHash для введенной строки.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

ElfHash.Demo.zip (2,638 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 52 | Комментариев: 1

Метки: Assembler, хеши

Комментарии

Отзывы посетителей сайта о статье
Grey (19.12.2025 в 08:52):
Круто. Аналогичная функция Си на гите занимает 600 строк и кучу библиотек.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0035 сек.) / Память: 4.5 Mb
Наверх