Blog. Just Blog

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

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

Алгоритм djb2 - одна из самых известных некриптографических хеш-функций для строк. Разработанный выдающимся математиком Дэниелом Бернстайном, который также хорошо известен по алгоритму SipHash-2-4, djb2 стал настоящим стандартом благодаря балансу между простотой реализации, скоростью работы и качеством распределения хешей. Это та самая функция, к которой обращаются, когда нужен быстрый и надежный хеш для хеш-таблицы.

Алгоритм был впервые опубликован Дэниелом Бернстайном много лет назад в знаменитой новостной группе comp.lang.c. В мире Unix и C эта группа была местом, где рождались и обсуждались самые важные инженерные решения. Главное преимущество djb2 - компактность и эффективность на низком уровне. В эпоху программирования под DOS и на Ассемблере, когда каждый байт и каждый такт процессора были на счету, она стала идеальным решением. Функция использует всего две основные операции: сдвиг и сложение, что позволяет реализовать ее буквально несколькими инструкциями CPU.

hash = hash * 33 + c
Или вариант на Ассемблере, если он вам более приятен:
  1.         mov     esi,[lpStr]
  2.         mov     ecx,[dLen]
  3.         xor     eax,eax
  4.  
  5.         mov     ebx,5381
  6. .loop:
  7.         lodsb
  8.         imul    ebx,33
  9.         add     ebx,eax
  10.         loop    .loop
В основе функции лежат два ключевых числа: 33 и 5381. Число 33 - не простое, но оно оказалось эмпирически лучшим кандидатом для перемешивания битов. С точки зрения программирования, его гениальность в том, что умножение на 33 можно заменить простой конструкцией: (hash << 5) + hash. Сдвиг влево на 5 бит - умножение на 32, прибавление исходного значения дает те самые 33. Эта конструкция работала молниеносно даже на процессорах 286, а тем более на новых. Например:
  1.         ; 16-битная версия (оригинальный 8086)
  2.         mov     dx,bx
  3.         shl     dx,1
  4.         shl     dx,1
  5.         shl     dx,1
  6.         shl     dx,1
  7.         shl     dx,1
  8.         ; *32
  9.         add     bx,dx
или даже так
  1.         mov     dx,bx
  2.         ; На 8086 нет shl reg,5
  3.         ; shl   dx,5  
  4.         ; Только через CL или 5 раз
  5.         mov     cl,5
  6.         shl     dx,cl
  7.         add     bx,dx
Почему 5381? Это стартовое значение хеша. В шестнадцатеричном виде это 0x1505. Оно достаточно большое, чтобы начать перемешивание битов с первого же символа, но при этом не вызывает слишком быстрого переполнения на коротких строках. Точная причина его выбора остается на совести автора, но именно это число показало себя лучше многих других констант.

Также существует две версии djb2, и здесь часто возникает путаница. Дело в том, что обе версии считаются каноническими, так как были предложены самим Бернстайном. Классическая версия (через ADD) - самая распространенная реализация, которую можно встретить в учебниках и исходниках. Оригинальная версия (через XOR) - та, которую позже стал предпочитать сам автор. Она обладает немного другими свойствами перемешивания и может быть предпочтительнее для определенных типов данных.

hash = hash * 33 ^ c
И Ассемблер, конечно же.
  1.         mov     esi,[lpStr]
  2.         mov     ecx,[dLen]
  3.         xor     eax,eax
  4.  
  5.         mov     ebx,5381
  6. .loop:
  7.         lodsb
  8.         imul    ebx,33
  9.         xor     ebx,eax
  10.         loop    .loop
Обе версии работают превосходно. Выбор между ними обычно сводится к традиции или незначительным нюансам распределения хешей.

Простая идея, реализованная в djb2, может жить десятилетиями. Это не просто функция, а часть истории программирования. Ее ценят и олдскульные кодеры, пишущие на ассемблере, и современные разработчики, которым важны эффективность и проверенные решения.

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

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

djb2.Demo.zip (4,787 bytes)


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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (26.08.2026 в 12:21):
Поправил, спасибо. В исходнике все правильно, а в статье пропустил.
_ (26.08.2026 в 12:17):
"mov edx,5381" не должно быть "mov ebx,5381"?

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

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

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