Skip to content

Pirma hash generatoriaus versija

Choose a tag to compare

@Athena-Verona Athena-Verona released this 27 Sep 08:14
· 10 commits to main since this release

Tai yra hash generatoriaus pirma versija. Kodas gali priimti įvestį arba iš išorinio failo, arba kaip komandinės eilutės argumentą. Tada jis atlieka skaičiavimus ir ekrane parodo rezultatą: eilutę "suhashuotą".

Hash algoritmo veikimo principas:

function hash(ivedimoEilute):

dvejetaineEilute = ""
for each character c in ivedimoEilute:
    dvejetainisKodas = paverstiDvejetainiuKodu(c)
    dvejetaineEilute += dvejetainisKodas

asciiSuma = 0
for each character c in ivedimoEilute:
    asciiSuma += gautiAsciiReiksme(c)

if dvejetaineEilute.length() < 256:
    n = 256 - dvejetaineEilute.length()
    k = 0.7 * n
    y = 256 - k
    
    for i from 1 to k:
        dvejetaineEilute = "1" + dvejetaineEilute
    
    for i from 1 to y:
        dvejetaineEilute = "0" + dvejetaineEilute

blokuKiekis = dvejetaineEilute.length() / 2

while asciiSuma > 1000:
    asciiSuma = asciiSuma / 10

for i from 1 to (asciiSuma / 3) + 1:
    blokai = sukurtiBlokuMasyva(blokuKiekis)
    
    //sioje vietoje sudaromi blokai po 2 bitus: vienas is eilutes galo, kitas is priekio
    for j from 1 to blokuKiekis:
        blokai[j] = dvejetaineEilute[j] + dvejetaineEilute[dvejetaineEilute.length() - j]

    dvejetaineEilute = ""
    
    //tas pats principas kartojamas su visais blokais: vienas is priekio, vienas is galo
    while blokai is not empty:
        dvejetaineEilute += blokai.first()
        dvejetaineEilute += blokai.last()
        remove blokai.first()
        remove blokai.last()

 //imant po 7 bitukus, konvertuoi juos i desimtaini koda, tada i sesioliktaini
for i from 0 to dvejetaineEilute.length() - 1, incrementing by 7:
    dvejetainisKodukas = dvejetaineEilute.substr(i, 7)
    desimtainisKodukas = keisti_Is_Dvejetainio_I_Desimtaini(dvejetainisKodukas)
    hexKodas += keisti_Is_Desimtainio_I_Sesioliktaini(desimtainisKodukas)

//sumazinti hex koda iki 64 ilgio
if hexKodas.length() > 64:
    hexKodas = hexKodas.substr(0, 64)

return hexString

Eksperimentiniai tyrimai

Deterministiškumas, hex kodo ilgis

Kodui patikrinti buvo sukurti keli failai patikrinti, kaip gerai jis veikia.
Pirmasis failas buvo 2000.txt, sukurtas iš daug atsitiktinių simbolių patikrinti, ar kelis kart suvedus daug simbolių turinčią eilutę, rezultatas būtų toks pat. Rezultatai:

2000.txt pirma kart: 1940595c6e56b604f1c2e5b743b41456386b3c284b5d266b43687d2875c7e5a4
2000.txt antra kart : 1940595c6e56b604f1c2e5b743b41456386b3c284b5d266b43687d2875c7e5a4

Reiškia, algoritmas yra deterministinis ir tikrai sukuria 64 simbolių eilutę

Antrieji failai word1.txt ir word2.txt turi tik po vieną žodį, kuris skiriasi viena raide: Karolis ir karolis. Rezultatai tokie:

word1.txt (Karolis) : 255b2b2c477b5d796d563c3c786b333b26f747452526470211c764b5d476f758
word2.txt (karolis): 161b556353162b4a365b65775584233664606e4f9225d45363e6c8476b56795d

Abu žodžiai yra 64 simbolių ilgio (galite patikrinti, tikrai), taip pat visai skiriasi, čia matosi avalanche effect.

Tretieji failai buvo 1000originalus.txt ir 1000pakeistas.txt su daugiau nei 1000 atsitiktinių simbolių, tačiau antrasis failas turėjo tik vieną pakeistą simbolį, 438 vietoje. Rezultatai:

1000originalus.txt : 2358496e58237c67064b1310624a1f0677a391954ec3c3f17452614d14744335
1000pakeistas.txt : 2358496e58237c67064b1310624a1f0677a391954ec3c3f17452614d14744335

Hash kodas lygiai toks pats, reiškia, veikia netobulai.

Hash algoritmo efektyvumas

Čia buvo tirta hash kodo skaičiavimų trukmė priklausomai nuo hash eilutės ilgio/kiekio. Tam sukurtas atskiras kodas (nesantis repozitorijoje) ir testuota su konstitucija.txt. Rezultatai pavaizduoti grafiškai paveikslėlyje

| 2 | 1,987 |
| 4 | 0,678 |
| 8 | 3,026 |
| 16 | 38,127 |
| 32 | 26,356 |
| 64 | 229,377 |

Panašu, kad rezultatai nėra kylantys tolygiai.

Collision

Deja, paskutinio eksperimento nepavyko atlikti iki galo. Vien tam, kad kodas patikrinų 25 000 porų po 10 simbolių, prireikė kelių valandų skaičiavimų. Rezultatas buvo 0 sutapimų.
O 25 000 porų po 10 simbolių, kurie skiriasi tik vienu simboliu, buvo rasti 82 sutapimai

Išvados

Šis hash algoritmas beveik veikia taip, kaip turėtų. Kodas yra deterministinis ir visada 64 simbolių ilgio, netgi veikia avalanche effect su nedideliais kiekiais duomenų. Tačiau jei turime identiškas ilgas eilutes su minimaliais pakeitimais tarpusavy, hash kodas būna toks pat. Taip pat algoritmas veikia ganėtinai lėtai.