From 87b588f63e2b18311f823ee62d1db430cc4b5f8d Mon Sep 17 00:00:00 2001 From: Dmitrii Krosh Date: Thu, 27 Aug 2026 06:50:15 +0300 Subject: [PATCH] last chapters --- articles/for-asvk/article/article_hbd.tex | 34 ++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/articles/for-asvk/article/article_hbd.tex b/articles/for-asvk/article/article_hbd.tex index 6c20809..481779b 100644 --- a/articles/for-asvk/article/article_hbd.tex +++ b/articles/for-asvk/article/article_hbd.tex @@ -483,7 +483,39 @@ CityHash32 & 16,70 & 4,10 \\ На строках длиной 32 байта xxHash32 был быстрее Jenkins примерно в 4,4 раза, CityHash32 --- в 3,1 раза. При 1024 байтах различие по пропускной способности достигало соответственно 9,8 и 7,7 раза. Следовательно, Jenkins OAAT не является оптимальным по скорости, особенно на длинных входах. -Для оценки качества использовались +Для оценки качества использовался другой тест, в нём сравнивались Jenkins OAAT, 64-битный xxHash и \texttt{t1ha2\_atonce};. Поскольку формат \texttt{set:version} сохраняет не более 32 бит хеша, при сопоставлении учитывались младшие 32 выходных бита всех трёх функций. + +Тест измерял лавинный эффект на реальном корпусе экспортируемых C++-символов ALT Linux p11. Утилита \texttt{provided\_symbols} извлекла из 259 ELF-файлов пяти пакетов 577\,509 уникальных имён. Пакеты выбирались среди имеющих наиболее длинные \texttt{Provides set:}-строки. Корпус специально является сложным для хеширования похожих строк: 99,60\% символов имеют с другим символом общий префикс длиной не менее 12 знаков, 95,05\% --- не менее 24 знаков, а медиана максимального общего префикса равна 61 знаку. + +Для каждого бита вычислялась доля $q_i$ корпусных хешей, в которых этот бит равен единице. Идеальному распределению соответствует $q_i=0{,}5$. Результаты обоих тестов представлены в табл.~\Ref{HASH_QUALITY_EXOTIC}. Значения приведены в процентах от полной шкалы вероятности; последний столбец содержит максимальное среднее абсолютное отклонение младших 32 бит от $0{,}5$. + +Среднее абсолютное отклонение по младшим 32 битам вычислялось как: +\[ +\overline{\Delta}=\frac{1}{32}\sum_{i=0}^{31}|p_i-0{,}5|. +\] +Меньшее значение $\overline{\Delta}$ соответствует более равномерному лавинному эффекту. + +\begin{table}[H] +\begin{center} +\caption{\label{HASH_QUALITY_EXOTIC}Качество перемешивания младших 32 бит хеш-функций} +\scriptsize +\begin{tabular}{|l|r|r|r|r|} +\hline +Функция & \makecell{Корпус\\$\overline{\Delta}$, \%} & \makecell{Корпус\\$\Delta_{\max}$, \%} \\ +\hline +Jenkins OAAT & 0,0475 & 0,167 \\ +\hline +xxHash64 & 0,0431 & 0,122 \\ +\hline +t1ha2 & 0,0615 & 0,188 \\ +\hline +\end{tabular} +\end{center} +\end{table} + +Все три функции продемонстрировали близкое к равномерному распределение. На реальном корпусе лучший результат получен для xxHash64, однако разность между функциями составляла сотые доли процента, а максимальное отклонение отдельного бита не превысило 0,188\%. + +Таким образом, тестирование на похожих C++-символах не выявило недостаточного перемешивания Jenkins OAAT. xxHash64 и t1ha2 остаются кандидатами для отдельной оценки производительности, но качество распределения само по себе не обосновывает замену Jenkins. \References \begin{enumerate}