MakarovSuites
Українська
EnglishDeutschРусскийУкраїнськаFrançaisEspañolItalianoPolski
Зв’язок і ліцензії

Math

Хеші та кошики

Сортувальний стіл: ключі — паперові бирки, каретка хешує кожну і кидає в кошик з номером хешу, колізія — два різні ключі в одному кошику. Хеш — іменована функція: сума кодів, многочлен з основою 31, FNV-1a — або рівномірний оракул, що стоїть за кривою днів народження. Відредагуй ключ, подивись обчислення хешу по символах, переверни один біт і порахуй зсунуті біти хешу; порівняй дві функції на тих самих ключах.

Хеші та кошики — Зображення з програми
Зображення з програми

Що відбувається

Двадцять три людини в кімнаті частіше ділять день народження, ніж ні, і та сама арифметика задає розмір хеш-таблиці. Тут ключі — справжні рядки, а хеш — ІМЕНОВАНА функція: сума кодів символів, многочлен з основою 31, FNV-1a — або рівномірний оракул, який не має ключа взагалі і стоїть за кривою. Каретка на рейці хешує бирку і кидає її в кошик з номером-індексом; бирка, що впала на іншу, — колізія, і обидва ключі лишаються підсвіченими. Аркуш обчислює хеш пробного ключа по символах, перевертає один біт ключа і рахує зсунуті біти хешу. Три питання розведено: колізії, рівномірність (χ² завантажень проти n/m, очікування m − 1) і лавина; гістограма, рівна на випадкових словах, — не вирок функції: дай сумі літер список анаграм, і всі ключі ляжуть в один кошик. Ніщо з цього — не криптостійкість.

Рівняння модуля
Рівняння
n ключів у m кошиків, рівномірно
P(принаймні одна колізія) = 1 − добуток (1 − i/m),  РІВНО:  n = 23, m = 365 -> 0.50729723432398566;  n = 50 -> 0.97037357957798842
очікувана кількість порожніх кошиків = m·(1 − 1/m)^n  РІВНО - а не звичне m·e^(−n/m):  при n = m = 100 вони дорівнюють 36.603234127322921 та 36.787944, і різницю видно
ключів до першої колізії, у середньому:  sqrt(pi·m/2) + 2/3 = 24.611199639354552 для m = 365 (підраховано 24.6767 за 20 000 запусків)
максимальне навантаження при n = m поводиться як ln n / ln ln n - це АСИМПТОТИКА, а не формула: виміряне відношення ЗРОСТАЄ, 1.32 при m = 64, 1.49 при 256, 1.55 при 1024
тому її перевіряють як діапазон і як монотонний тренд, ніколи не прив'язуючи до числа
виміряно порівняно з точною кривою (по 20 000 запусків):  n = 10 -> 0.11605 проти 0.11695;  n = 23 -> 0.50800 проти 0.50730;  n = 70 -> 0.99920 проти 0.99916
іменовані функції від ключа k = c₁c₂…c_n (коди символів), усі за модулем 2³²:  сума: h = Σ c_i;  основа 31: h ← 31·h + c_i;  FNV-1a: h₀ = 2166136261, h ← (h виключне АБО c_i)·16777619
кошик = h mod m;  рівномірний оракул вибирає кошик за зерном і НОМЕРОМ ключа - самого ключа в нього немає
рівномірність: χ² = Σ (load_j − n/m)² / (n/m) по m кошиках; рівномірний розподіл дає m − 1 ± √(2(m − 1))
лавинний ефект: середнє по ключах від Hamming(h(k), h(k′)) при зміні ОДНОГО біта k; ідеальна функція змінює 16 з 32
виміряно (зерно 20260913, 40 випадкових слів у 64 кошики): FNV-1a 7 колізій, χ² 46.4, лавинний ефект 14.6;  основа 31: 9, 52.8, 6.2;  сума: 8, 52.8, 2.05;  оракул: 9, 59.2, без бітів
40 анаграм одного слова під сумою: 39 колізій, один ланцюжок із 40, χ² = 2520 - сума не розрізняє порядок літер

Інші експерименти

До каталогу
Перегони сортувань — Зображення з програми

Math

Перегони сортувань

Три сортування біжать по одному масиву з однаковою швидкістю в ПОРІВНЯННЯХ, і першим фінішує те, що спитало менше. Вирішує не розмір, а безлад: на впорядкованому вході вставки беруть 63 порівняння, а швидке — 2016.

Ширина і глибина — Зображення з програми

Math

Ширина і глибина

Два однакові лабіринти, два обходи, клітинка за такт. Шар, на якому ширина знайшла клітинку, дорівнює найкоротшому шляху — це тотожність. Глибина не коротша ніколи, а наскільки довша — залежить від того, куди йти.

Найдешевший шлях — Зображення з програми

Math

Найдешевший шлях

Місцевість, де крок коштує ціну клітинки, у яку входиш, і хвиля закритих вершин розходиться за ЦІНОЮ, а не за відстанню. Повзунок кладе на карту від’ємне ребро і має три виміряні ділянки.