Hlavní navigace

Názor ke zprávičce Velmi rychlá kryptografická hašovací funkce BLAKE3 vyšla ve verzi 1.0.0 od Filip Jirsák - Nie je deterministicka. Je deterministická. Po dobu běhu aplikace...

  • 29. 7. 2021 17:26

    Filip Jirsák

    Nie je deterministicka.
    Je deterministická. Po dobu běhu aplikace bude pro stejný objekt vracet stále stejnou hodnotu. Když si nějaký enum uložíte do EnumSetu, vždycky ho tam později najdete. Kdyby ta funkce nebyla deterministická, mohlo by se stát, že by se tam enum nenašel, i kdyby tam byl.

    Je odvodena z adresy objektu vo VM.
    Ano, tak jsme se k tomu dostali. Jako příklad hashovací funkce jsem uváděl funkci, jejíž výstup závisí na referenci na vstupní objekt. A pak jsem javovské hashCode() uváděl jako reálný příklad takové implementace.

    Přečtěte si konečně ten článek na Wikipedii, který jste odkazoval.

    Po dealokovani objektov moze mat novo alokovany objekt rovnake hashCode ako niektory z dealokovanych i ked ide o uplne iny objekt.
    Jinými slovy, může vzniknout kolize. Jaké překvapení.

    Deterministicka je napr String.hashCode.
    Pro tu ovšem také může vzniknout kolize. A i pro ni platí, že mezi dvěma běhy aplikace se hashCode pro stejný String může změnit. Protože způsob výpočtu hashCode pro String není v API závazně popsán, jiná implementace standardní knihovny nebo jiná implementace JVM ho může počítat jinak.

    Rovnako ako pre vami spominanu fyzicku osobu bude hash deterministicky vtedy ak sa bude pocitat napr z rodneho cisla, nie z gps suradnic.
    Když se bude hashCode počítat z rodného čísla, při změně rodného čísla osoby se vypočítá jiný hash, i když se osoba nezměnila. Vy tu funkci sice nazýváte deterministickou, ovšem ta funkce nesplňuje podmínky pro hashCode v Javě a není to hashovací funkce v tom všeobecně uznávaném významu (který je např. na Wikipedii), protože není zaručeno, že pro stejný vstup (tedy stejnou osobu) vrátí vždy stejný výstup.