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

Алгоритм хеширования djb2 на Ассемблере
Алгоритм djb2 - одна из самых известных некриптографических хеш-функций для строк. Разработанный выдающимся математиком Дэниелом Бернстайном, который также хорошо известен по алгоритму SipHash-2-4, djb2 стал настоящим стандартом благодаря балансу между простотой реализации, скоростью работы и качеством распределения хешей. Это та самая функция, к которой обращаются, когда нужен быстрый и надежный хеш для хеш-таблицы.
Алгоритм был впервые опубликован Дэниелом Бернстайном много лет назад в знаменитой новостной группе comp.lang.c. В мире Unix и C эта группа была местом, где рождались и обсуждались самые важные инженерные решения. Главное преимущество djb2 - компактность и эффективность на низком уровне. В эпоху программирования под DOS и на Ассемблере, когда каждый байт и каждый такт процессора были на счету, она стала идеальным решением. Функция использует всего две основные операции: сдвиг и сложение, что позволяет реализовать ее буквально несколькими инструкциями CPU.
hash = hash * 33 + cИли вариант на Ассемблере, если он вам более приятен:
Code (Assembler) : Убрать нумерацию
- mov esi,[lpStr]
- mov ecx,[dLen]
- xor eax,eax
- mov ebx,5381
- .loop:
- lodsb
- imul ebx,33
- add ebx,eax
- loop .loop
Code (Assembler) : Убрать нумерацию
- ; 16-битная версия (оригинальный 8086)
- mov dx,bx
- shl dx,1
- shl dx,1
- shl dx,1
- shl dx,1
- shl dx,1
- ; *32
- add bx,dx
Code (Assembler) : Убрать нумерацию
- mov dx,bx
- ; На 8086 нет shl reg,5
- ; shl dx,5
- ; Только через CL или 5 раз
- mov cl,5
- shl dx,cl
- add bx,dx
Также существует две версии djb2, и здесь часто возникает путаница. Дело в том, что обе версии считаются каноническими, так как были предложены самим Бернстайном. Классическая версия (через ADD) - самая распространенная реализация, которую можно встретить в учебниках и исходниках. Оригинальная версия (через XOR) - та, которую позже стал предпочитать сам автор. Она обладает немного другими свойствами перемешивания и может быть предпочтительнее для определенных типов данных.
hash = hash * 33 ^ cИ Ассемблер, конечно же.
Code (Assembler) : Убрать нумерацию
- mov esi,[lpStr]
- mov ecx,[dLen]
- xor eax,eax
- mov ebx,5381
- .loop:
- lodsb
- imul ebx,33
- xor ebx,eax
- loop .loop
Простая идея, реализованная в djb2, может жить десятилетиями. Это не просто функция, а часть истории программирования. Ее ценят и олдскульные кодеры, пишущие на ассемблере, и современные разработчики, которым важны эффективность и проверенные решения.
В приложении примеры программ с исходными текстами, демонстрирующие вычисление различных вариантов хешей djb2 для введенной строки.
Просмотров: 161 | Комментариев: 2
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(26.08.2026 в 12:21):
Поправил, спасибо. В исходнике все правильно, а в статье пропустил.
_
(26.08.2026 в 12:17):
"mov edx,5381" не должно быть "mov ebx,5381"?
Добавить комментарий
Заполните форму для добавления комментария
Примеры программ с исходными текстами (FASM)
