Räsifunktsioon: erinevus redaktsioonide vahel

Allikas: Vikipeedia
Eemaldatud sisu Lisatud sisu
Resümee puudub
D.Krasnov (arutelu | kaastöö)
Resümee puudub
18. rida: 18. rida:


1990-te aastate alguseni venekeelses kirjanduses oli tänu Andrei Jeršovi töödele kasutatud termini "räsimine" ekvivalendina sõna "järjestus", ning kollisioonide jaoks kasutati terminit "konflikt". Tänapäeval on jäänud vaid sõna "räsimine".
1990-te aastate alguseni venekeelses kirjanduses oli tänu Andrei Jeršovi töödele kasutatud termini "räsimine" ekvivalendina sõna "järjestus", ning kollisioonide jaoks kasutati terminit "konflikt". Tänapäeval on jäänud vaid sõna "räsimine".

== Räsifunktsioonide liigid ==
Hea räsifunktsioon peab vastama kahele tingimusele:
* Olema kiiresti arvutatav;
* Minimiseerima kollisioonide arvu.

Määratletuseks oletame, et võtide arv on <math>K</math>, ja räsifunktsioonil <math>h(K)</math> on mitte rohkem, kui <math>M</math> erinevaid tähendusi:

<math>0<h(k)<M</math>
"Halva" räsifunktsiooni näitena võib tuua funktsiooni <math>M=1000</math>, mis kümnekohalisele [[Naturaalarv|naturaalarvule]] <math>K</math> vastastab kolm numbri <math>K</math> kahekümnenda ruudu keskest valitud arvu. Tundub, et räsikoodide tähendused peaksid ühtlaselt jaotuma «000» ja «999» vahel, kuid reaalsete andmete jaoks selline meetod sobib vaid juhul, kui võtmetel pole suurt nullide arvu vasakul ja paremal.{{sfn|Дональд Кнут. Искусство программирования}}

Kuid on olemas mitu lihtsamaid ja kindlamaid meetodeid, millele tuginevad paljud räsifunktsioonid.

=== Jagamisele rajatud räsifunktsioonid ===
Esimene meetod seisneb selles, et me kasutame räsina jagamise <math>M</math>-ga jääki, kus <math>M</math> on kõikide võimalike räside arv:

: <math>h(K) = K \mod M </math>

Seejuures on ilmselge, et paaris-<math>M</math> puhul funktsiooni tähendus on ka paarisarvuline, paaris-<math>K</math> puhul, ning paaritu - paaritu puhul, mis võib viia failiandmete olulise nihutuseni. Samuti ei tasu kasutada <math>M</math>-na arvuti arvutamise aluse astet, kuna räsikood sõltub ainult <math>K</math> arvu mitmetest paremal asuvatest numbritest, mis viib suure kollisioonide arvuni. Praktikal tavaliselt valitakse hariliku (alg-) <math>M</math> - enamikul juhtudest selline valik on täitsa rahuldav.

Veel tasuks mainida räsimise meetodit, mis on rajatud mooduliga kaks jagamisele polünoomile. Antud meetodi puhul <math>M</math> peab samuti olema kahe aste, ning binaarvõtid (<math>K=k_{n-1}k_{n-2}...k_{0}</math>) on kujutatud polünoomidena. Sel juhul räsikoodina võetakse tegurite tähendusi polünoomist, mis on saadud nagu jääk <math>K</math> jagamisest eelnevalt valitud polünoomiga <math>P</math> astmes <math>m</math>:

: <math>K(x) \mod P(x) = h_{m-1}x^{m-1}+h_{1}x+h_{0} </math>
: <math> h(x)=h_{m-1}...h_{1}h_{0}</math>

Õigesti valitud <math>P(x)</math> puhul selline viis tagab kollisioonide peaaegu sarnaste võtmete vahel puudumise.{{snf|Дональд Кнут. Искусство программирования}}

=== Räsimise multiplikaatne skeem ===
Teine meetod seisneb mingi terve konstandi <math>A</math>, mis on vastastikult harilik <math>w</math>-ga, valimises, kus <math>w</math> on masinsõna abil esindatavate tähenduste arv (IBM PC arvutites see on <math>2^{32}</math>). Siis võib võtta järgmist räsifunktsiooni:

: <math>h(k) = \left[ M \left\lfloor \frac{A}{w}*K \right\rfloor \right]</math>

Sel juhul, kahendsüsteemiga arvutil <math>M</math> on kahe aste ning <math>h(K)</math> koosneb korrutise <math>A*K</math> parempoolsetest vanematest bittidest.

Nende kahe meetodite eeliste hulgas tasub mainida, et nad kasulikul viisil kasutavad seda, et reaalsed võtmed pole juhuslikud, näiteks juhul, kui võtmed kujutavad endast aritmeetilist progressiooni (näiteks nimede «NIMI1», «NIMI2», «NIMI3» järjestust). Multiplikaatne meetod näitab aritmeetilist progressiooni kui erinevate räsitähenduste lähtestatud aritmeetilist progressiooni, mis vähendab kollisioonide arvu võrreldes juhusliku olukorraga.

Selle meetodi üks variatsioonidest on Fibonacci arvu räsimine, mis põhineb kuldlõige omadustel. <math>A</math> arvuna võetakse lähedasemat <math>\varphi^{-1}*w</math> arvule algarvu, mis on vastastikult harilik <math>w</math>-ga.



==Vaata ka==
==Vaata ka==

Redaktsioon: 2. märts 2014, kell 15:31

Räsifunktsioon (inglise hash function) on krüptograafias kasutatav ühesuunaline funktsioon tekstistringide kodeerimiseks[1].

Räsifunktsiooni kasutatakse assotsiatiivsete massiivide ülesehituseks, andmekogumite seeriates dublikaatide otsimiseks, unikaalsete identifikaatorite (andmekogumite jaoks) ülesehituseks, kontroll-liitmiseks kogemata või meelega pandud (säilimisel või ülekandmisel) vigade leidmise eesmärgil, ka kaitsesüsteemide paroolide säilitamiseks (sel juhul ligipääs sellele mälukohale, kus asuvad paroolid, ei lase taastada parooli ennast).

Üldjuhul ühemõttelist vastavust lähteandmete ning räsikoodi vahel pole seetõttu, et räsifunktsiooni tähenduste arv on vähem, kui sisendmassiivi variantide arv; on olemas palju massiive erineva sisuga, mis annavad samu räsikoode - siis on tegemist nn. kollisioonidega. Kollisioonide tekkimise tõenäosus mängib suurt rolli räsifunktsioonide kvaliteedi hindamisel.

On olemas palju räsimisalgoritme erinevate omadustega (arvutuse raskus, krüpteerimiskindlus jne.). Ühe või teise räsifunktsiooni valiku tehakse kindlaks lahendava ülesanne eripäraga.

Ajalugu

Donald Knuth arvab esimese räsimise süsteemi idee autoriks IBM kaastöötajat, kelleks on Hans Peter Lun, kes pakkus välja kodeerimist räsimise abil jaanuaris 1953. Arnold Dumey esitas oma 1956. aasta töös "Computers and automation" esimesena räsimise kontseptsiooni sellisena, millena seda teab enamik programmeerijatest tänapäeval. Dumey vaatas räsimist nagu "Sõnaraamatu probleemi" lahendust ning pakkus välja kasutada räsiaadressiks algarvuga jagamise jääki.

Esimeseks tõsiseks tööks, mis oli seotud otsimisega suurtest failidest, oli W. Wesley Petersoni artikkel 1957. aastal, milles ta avas avaliku adresseerimist ning osutas tootlikkuse halvenemisele kustutamisel. Kuus aastat hiljem avalikustati Werner Buchholz töö, milles on tehtud räsifunktsioonide lai uurimine. Mitmete järgmiste aastate jooksul oli räsimine küll laialt kasutatud, aga ei avalikustatud mitte ainsatki tähtsat tööd.

1967. aastal mainis räsimist kaasaegses tähenduses Herbert Hellerman oma raamatus "Numbriliste arvutisüsteemide põhimõtted". 1968. aastal avalikustas Robert Morris suure räsimise ülevaate ning seda tööd arvatakse võtmepublikatsiooniks, mis viis räsimise mõiste teaduslikku keelendi sisse ning kinnistas seni vaid spetsialistide argoos kasutatud terminit "räsi".

1990-te aastate alguseni venekeelses kirjanduses oli tänu Andrei Jeršovi töödele kasutatud termini "räsimine" ekvivalendina sõna "järjestus", ning kollisioonide jaoks kasutati terminit "konflikt". Tänapäeval on jäänud vaid sõna "räsimine".

Räsifunktsioonide liigid

Hea räsifunktsioon peab vastama kahele tingimusele:

  • Olema kiiresti arvutatav;
  • Minimiseerima kollisioonide arvu.

Määratletuseks oletame, et võtide arv on , ja räsifunktsioonil on mitte rohkem, kui erinevaid tähendusi:

"Halva" räsifunktsiooni näitena võib tuua funktsiooni , mis kümnekohalisele naturaalarvule vastastab kolm numbri kahekümnenda ruudu keskest valitud arvu. Tundub, et räsikoodide tähendused peaksid ühtlaselt jaotuma «000» ja «999» vahel, kuid reaalsete andmete jaoks selline meetod sobib vaid juhul, kui võtmetel pole suurt nullide arvu vasakul ja paremal.[2]

Kuid on olemas mitu lihtsamaid ja kindlamaid meetodeid, millele tuginevad paljud räsifunktsioonid.

Jagamisele rajatud räsifunktsioonid

Esimene meetod seisneb selles, et me kasutame räsina jagamise -ga jääki, kus on kõikide võimalike räside arv:

Seejuures on ilmselge, et paaris- puhul funktsiooni tähendus on ka paarisarvuline, paaris- puhul, ning paaritu - paaritu puhul, mis võib viia failiandmete olulise nihutuseni. Samuti ei tasu kasutada -na arvuti arvutamise aluse astet, kuna räsikood sõltub ainult arvu mitmetest paremal asuvatest numbritest, mis viib suure kollisioonide arvuni. Praktikal tavaliselt valitakse hariliku (alg-) - enamikul juhtudest selline valik on täitsa rahuldav.

Veel tasuks mainida räsimise meetodit, mis on rajatud mooduliga kaks jagamisele polünoomile. Antud meetodi puhul peab samuti olema kahe aste, ning binaarvõtid () on kujutatud polünoomidena. Sel juhul räsikoodina võetakse tegurite tähendusi polünoomist, mis on saadud nagu jääk jagamisest eelnevalt valitud polünoomiga astmes :

Õigesti valitud puhul selline viis tagab kollisioonide peaaegu sarnaste võtmete vahel puudumise.Mall:Snf

Räsimise multiplikaatne skeem

Teine meetod seisneb mingi terve konstandi , mis on vastastikult harilik -ga, valimises, kus on masinsõna abil esindatavate tähenduste arv (IBM PC arvutites see on ). Siis võib võtta järgmist räsifunktsiooni:

Sel juhul, kahendsüsteemiga arvutil on kahe aste ning koosneb korrutise parempoolsetest vanematest bittidest.

Nende kahe meetodite eeliste hulgas tasub mainida, et nad kasulikul viisil kasutavad seda, et reaalsed võtmed pole juhuslikud, näiteks juhul, kui võtmed kujutavad endast aritmeetilist progressiooni (näiteks nimede «NIMI1», «NIMI2», «NIMI3» järjestust). Multiplikaatne meetod näitab aritmeetilist progressiooni kui erinevate räsitähenduste lähtestatud aritmeetilist progressiooni, mis vähendab kollisioonide arvu võrreldes juhusliku olukorraga.

Selle meetodi üks variatsioonidest on Fibonacci arvu räsimine, mis põhineb kuldlõige omadustel. arvuna võetakse lähedasemat arvule algarvu, mis on vastastikult harilik -ga.


Vaata ka

Viited

  1. e-Teatmik (vaadatud 04.09.2012)
  2. Дональд Кнут. Искусство программирования.