Xorcism

Xorcism

Nehéz

Utasítások

Írj egy streamelő adaptert, amely hivatkozást tartalmaz egy kulcsra, és bitenkénti XOR-t végez vele tetszőleges adatokon.

A XOR egy alapvető bináris művelet: a bemenetek minden egyes bitjénél állítsd a kimenet megfelelő bitjét 1-re, ha a bemeneti bitek különböznek. Ha mindkét bemenet 1, vagy mindkettő 0, akkor a kimenet megfelelő bitje 0 lesz.

Amikor egy dokumentumot XOR-ozol egy kulccsal, a kulcs annyiszor ismétlődik, ahányszor szükséges, így a kimeneti dokumentum hossza megegyezik a bemeneti dokumentuméval.

A dokumentumok kulccsal való XOR-ozását még a 20. század elején is alkalmazták a kriptográfiában. Bár az adatok elrejtésének módszereként ez teljesen elavult, meglepően hasznos lehet zajos, véletlenszerűnek tűnő adatok előállításához anélkül, hogy a valódi véletlenszerűség bonyodalmaira szükség lenne. A modern kriptográfiában bizonyos rejtjeleknél még ma is alkalmanként használják: maga a rejtjel csupán egy mechanizmus egy nagyon véletlenszerű, végtelenül hosszú kulcs előállítására, amelyet a dokumentummal XOR-oznak.

A XOR-titkosítás egyik érdekes tulajdonsága, hogy szimmetrikus: bármely számot önmagával XOR-ozva 0-t kapsz, bármely számot pedig 0-val XOR-ozva a bemeneti szám változatlanul jön vissza. Ezért egy XOR-ral titkosított dokumentum visszafejtéséhez XOR-titkosítsd újra ugyanazzal a kulccsal.

Allokációmentesség

Nem praktikus olyan tesztet írni, amely biztosítaná, hogy a structod másolás helyett hivatkozást tárol a kulcsra. Ugyanígy nem praktikus teszttel bizonyítani, hogy sem a munge, sem a munge_in_place, sem azok segédfüggvényei nem allokálnak a heapen. Ennek ellenére próbáld így megírni a megoldásodat.

Megvalósítás

Létre kell hoznod egy struct Xorcism nevű típust, amely hivatkozást tárol egy kulcsra. Ennek a structnak két metódust kell biztosítania: munge_in_place és munge. Az előbbi egy bájtpuffert módosít helyben. Az utóbbi egy iterátoradapter: tetszőleges adatiterátort fogad, és egy új adatiterátort ad vissza.

A feladat stub-szignatúrái szintaktikailag nagyrészt helyesek, de nem fordulnak le: a feladat lényegének nagy része, hogy megismerkedj az élettartamok és a generikusok használatával, ezért ezeket neked kell kitöltened. A feladat másik célja, hogy kitalálj egy megfelelő felbontást, amely lehetővé teszi mindkét metódus megvalósítását minimális ismétléssel. Ne félj további segédfüggvényeket bevezetni!

Hasznos trait-ek

Ezek a trait-ek lesznek hasznosak:

Bónusz tesztek

Ez a feladat bónusz teszteket tartalmaz, az io feature flag mögött. A bekapcsolásukhoz futtasd:

cargo test --features io

Ezekhez a tesztekhez implementálnod kell egy reader metódust a következő szignatúrával:

fn reader(self, impl Read) -> impl Read

és egy writer metódust a következő szignatúrával:

fn writer(self, impl Write) -> impl Write

Ezek a függvények a Xorcism structot a megfelelő irányú streamelő adapterré alakítják. A következő trait-eket használják:

A munge visszatérési értékének élettartama

Az impl Trait funkció használata miatt az élettartamok kezelése kissé trükkös lehet a munge metódus megvalósításakor. Könnyebb lehet, ha írsz egy saját struct-ot egy Iterator implementációval, és azt a konkrét típust adod vissza, legalább az elején. Végül is érdemes megpróbálni közvetlenül Iterator-kombinátorokkal megvalósítani a megoldást.


Forrás

Peter Goodspeed-Niklaus
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Rust Exercism

Készen állsz elkezdeni a(z) Xorcism feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Rust nyelvet 99 feladat segítségével, valódi emberi mentorálással, mindez ingyen.