ĂshtĂ« publikuar versioni 0.9.0 i bibliotekĂ«s dhe i mjetit konsol ndĂ«rplatformĂ« ZXC (github.com), qĂ« ofrojnĂ« kompresim asimetrik pa humbje me performancĂ« tĂ« lartĂ« dhe shumĂ«fijĂ«sh, i optimizuar pĂ«r asetet e lojĂ«rave, firmware-et dhe paketat e aplikacioneve. Formati Ă«shtĂ« zhvilluar sipas parimit «shkruaj njĂ« herĂ«, lexo shumĂ« herë» (WORM).
Ndryshe nga kodekët si LZ4, ZXC sakrifikon shpejtësinë e kompresimit për të arritur kapacitet maksimal gjatë dekompresimit.
Deklarohet se shpejtësia e dekompresimit është mbi 40% më e lartë se ajo e LZ4 në Apple Silicon, mbi 25% më e lartë në Google Axion (ARM64) dhe mbi 5% më e lartë në x86_64, duke siguruar njëkohësisht raport më të mirë kompresimi në të gjitha rastet.
Ky version sjell një API me kontekst të ripërdorshëm, mundësi për konfigurimin e madhësisë së bllokut, dokumentacion të plotë referues për API dhe ABI, si dhe disa rregullime të lidhura me sigurinë, përfshirë eliminimin e një dobësie të tejmbushjes së buffer-it në heap, të zbuluar gjatë fuzzing të modulit të kompresimit.
Ky publikim përmban ndryshime që thyejnë ABI, prandaj SOVERSION është rritur në 2.
Projekti është shkruar në gjuhën C dhe shpërndahet sipas licencës BSD 3.
Detajet
- Ndryshime që sjellin papajtueshmëri:
- SOVERSION 2: Versioni ABI i bibliotekës është rritur. Skedarët binarë të kompiluar për SOVERSION 1 duhet të rikompilohen.
- Strukturat e opsioneve: funksionet zxc_compress() dhe zxc_decompress() tani pranojnë zxc_compress_opts_t* dhe zxc_decompress_opts_t* në vend të parametrave pozicionalë. Për sjelljen e parazgjedhur, kaloni NULL.
- Kodimi i madhësisë së bllokut: Header-i i skedarit tani ruan madhësinë e bllokut si eksponent log2 [12..21] në vend të kodimit të mëparshëm me dy shkallë. Vlera e vjetër 64 pranohet ende për përputhshmëri prapa.
- Veçoritë e reja:
- Kontekste të errëta të kompresimit dhe dekompresimit, të alokuara në heap, që eliminojnë overhead-in e alokimit të memories në çdo thirrje; ideale për plugin-e të sistemit të skedarëve (squashfs, dwarfs) dhe përpunim në grup:
- zxc_create_cctx(), zxc_free_cctx() dhe zxc_compress_cctx() për kompresim;
- zxc_create_dctx(), zxc_free_dctx() dhe zxc_decompress_dctx() për dekompresim;
- buffer-at e brendshëm rialokohen vetëm nëse vlera e block_size ose level ndryshon midis thirrjeve.
- Kontekste të errëta të kompresimit dhe dekompresimit, të alokuara në heap, që eliminojnë overhead-in e alokimit të memories në çdo thirrje; ideale për plugin-e të sistemit të skedarëve (squashfs, dwarfs) dhe përpunim në grup:
- Madhësi të konfigurueshme të bllokut:
- madhësia e bllokut tani mund të konfigurohet përmes fushës block_size në strukturën zxc_compress_opts_t;
- diapazoni i lejuar: nga 4 KB deri në 2 MB (fuqi e dyshit);
- si parazgjedhje, vlera mbetet 256 KB;
- nĂ« programin e konsolĂ«s zxc Ă«shtĂ« shtuar parametri i ri âblock-size (ose -B) me mbĂ«shtetje pĂ«r prapashtesat e njĂ«sive matĂ«se (4K, 1M ose 4KB, 1MB etj.).
- Dekompresim i shpejtë i drejtpërdrejtë:
- kur buferi i destinacionit është mbushur mjaftueshëm, gjatë shpaketimit anashkalohet kopjimi i ndërmjetëm në buferin e punës, gjë që ul ngarkesën në memorie dhe shkurton vonesën.
- Siguri dhe stabilitet:
- është korrigjuar mbingarkesa e buferit të heap-it në zxc_bitpack_stream_32: cikli i paketimit mund të shkruante deri në 4 bajte përtej buferit të daljes nëse vlera e fundit e paketuar kalonte kufirin e bajtit;
- është korrigjuar kontrolli i stream-it gjatë shpaketimit (në zxc_decompress.c): është shtuar një verifikim që garanton se madhësia e stream-it të sekuencave është e mjaftueshme për numrin e deklaruar të sekuencave, duke parandaluar leximin jashtë diapazonit të lejuar.
- kontrolli i madhësisë së bllokut: tani në funksionet zxc_cctx_init() dhe zxc_read_file_header() verifikohet që madhësitë e blloqeve të jenë brenda diapazonit [ZXC_BLOCK_SIZE_MIN, ZXC_BLOCK_SIZE_MAX] dhe të jenë fuqi e dyshit;
- përputhshmëri me C++: të gjithë skedarët publikë header tani përmbajnë konstruktet mbrojtëse extern "C" për përdorim pa probleme në C++;
- ruajtja e korpusit të testeve për fuzz testing: është konfiguruar ruajtje e përhershme e korpusit për ClusterFuzzLite CI.
- Dokumentacioni:
- docs/API.md: udhëzues i ri i plotë për API dhe ABI, ku përshkruhen të gjitha 21 simbolet e eksportuara, përkufizimet e tipeve, strategjia e dukshmërisë, versionimi i ABI, garancitë e thread-safety dhe modelet e trajtimit të gabimeve;
- janë përditësuar man dhe skedari README me udhëzime instalimi dhe informacion mbi statusin e paketave (vcpkg, Conan, Homebrew);
- është përditësuar skedari docs/FORMAT.md me përshkrimin e kodimit të madhësisë së bllokut bazuar në eksponent.
- Janë përditësuar wrapper-at për Python, Rust dhe Node.js.
Burimi: linux.org.ru
