» »

rsync algoritem

rsync algoritem

'FireSTORM' ::

Pozdravljeni!

Saj ne vem če sem v pravem razdelku foruma, ampak nekak se najbolj zdi da bo ta pravi.
Hočem naštudirati rsync algoritem in se mi je trenutno zaustavilo pri iskanju rolling ter strong checksum po fajlu.
Izračun checksumov ni problematičen, ampak ne razumem četrte točke v tem dokumentu:
http://cs.anu.edu.au/techreports/1996/T...
bolj natančno, tega dela:
The fi rst level uses a 16-bit hash of the 32-bit rolling checksum and a 2^16
entry hash table. The list of checksum values (i.e., the checksums from the blocks
of B) is sorted according to the 16-bit hash of the 32-bit rolling checksum. Each
entry in the hash table points to the first element of the list for that hash value,
or contains a null value if no element of the list has that hash value.


Torej če prav razumem, pošiljatelj prejme rolling checksume neke datoteke razbite na več delov, ter tudi strong checksume(MD4 ali zdaj že MD5).
Iz teh prejetih rolling checksumov izračuna 16-bitne hashe. Ustvari seznam teh checksumov ki so sortirani glede na 16-bitne hashe. Potem tukaj dalje je pa tema. Kaj se shrani v hash table? Na katere elemente katerega seznama kaže za trenuten hash?

Hvala za pomoč in lep pozdarav!
Those penguins.... They sure aint normal....

Mavrik ::

Am, to je samo na dolg način razloženo delovanje zaprte hash tabele, ki kolizije razrešuje tako da na isto mesto daje seznam vseh elementov z istim hashom (to je najpogostejša implementacija hash tabele v jezikih, vključno z Javo, C# in ostalimi runtimi).

Kaj ti dopovejo je to - client dobi seznam 32bit checksumov blokov fajla, ki jih shrani v hash tabelo. Hash tabela uporablja 16-bitne hashe, kar pomeni da se pri vstavljanju teh checksumov v tabelo zračuna ta 16-bitni hash.
Potem pa preprosto računaš rolling checksum čez fajl in preverjaš, če v tej hash tabeli tisti checksum obstaja. Če obstaja, potem pomeni da imaš isti kos fajla kot na drugam koncu (torej ni treba pošilat), če je null, potem ni bilo ujemanja pri checksumu.

V Javi bi recimo algoritem v tisti točki zgledal nekak takole:


HashMap<short, Checksum> checksums = new HashMap(prejetiChecksumi);

Checksum rollingChecksum;
while(rollingChecksum = getNextRollingChecksum())
{
   if (checksums.contains(rollingChecksum))
   {
      System.out.println("Najden zadetek!");
   }
}



To je to :)
The truth is rarely pure and never simple.

Zgodovina sprememb…

  • spremenil: Mavrik ()

'FireSTORM' ::

Hvala za hiter odgovor.
Vendar imam še eno dodatno vprašanje k tvoji razlagi. :)
Predvsem okrog tega:
Če obstaja, potem pomeni da imaš isti kos fajla kot na drugam koncu (torej ni treba pošilat), če je null, potem ni bilo ujemanja pri checksumu.

Tam v dokumentu piše da če v hash table ni null, preide na drugi nivo iskanja in potem na tretji(strong checksum checking) in če se v tretjem ujemata pomeni da je našel enak del file-a in ga potem pošlje. Ni mi jasno zakaj pošlje del ki ga je našel v originalu oz. del ki obstaja na obeh koncih.
Those penguins.... They sure aint normal....

Mavrik ::

Okej, stvari so tak:

1.) Ker hash table slika 32-bitne checksume v 16-bit številke, je verjetnost kolizije precej velika, zato mora po tistem ko najde match še preveriti na seznamu elementov na tistem mestu, če so dejansko enaki (to spada k implementaciji tabele). To je 2nd level check s tistega dokumenta. Ker je seznam sortiran se lahko iskanje konča takoj ko najde 16-bitni hash, ki je isti a predstavlja drugi checksum.

2.) rsync uporablja en svoj checksum algoritem, ki je zelo hiter, a ima večjo verjetnost kolizije ("weak checksum"). Vsak najdeni match je zato potrebno preveriti še s "pravim" checksum algoritmom ("strong checksum", CPU precej zahtevnejši), da se izloči možnost napačnega matcha. To je 3rd level check.

Potem si pa mislim da narobe razumel zadnji odstavek - ne pošlje se blok za katerega si zračunal rolling checksum, ampak se pošlje del datoteke od zadnjega matcha pa do začetka trenutnega matcha ("from last match to current file offset") - torej pošlje se kos fajla med dvema matchoma, ki ni mel matchev.
The truth is rarely pure and never simple.

'FireSTORM' ::

Aha, zdaj je pa malo bolj jasno.
Hvala!
Those penguins.... They sure aint normal....


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Pokvarjeni podatki pri kopiranju čez mrežo

Oddelek: Pomoč in nasveti
474579 (3185) MrStein
»

[Java] Kako izračunati hash diska.

Oddelek: Programiranje
334727 (3557) kunigunda
»

SHA1 hash - prevod

Oddelek: Programiranje
103912 (3569) darkolord
»

C# HashSet<T>, HashTable kako deluje iskanje v ozadju? a lahko faila?

Oddelek: Programiranje
121478 (1259) detroit
»

Skrivanje gesel

Oddelek: Izdelava spletišč
392986 (2226) Tr0n

Več podobnih tem