XXH3: pemegang rekor kecepatan hash baru


Tingkatan yang dicapai dalam program SMHasher pada Core 2 Duo 3.0 GHz

Pada Habré berulang kali berbicara tentang fungsi hash non-kriptografi , yang merupakan urutan besarnya lebih cepat daripada yang kriptografi. Mereka digunakan di mana kecepatan penting dan tidak masuk akal untuk menggunakan MD5 lambat atau SHA1. Misalnya, untuk membangun tabel hash dengan penyimpanan pasangan kunci-nilai atau untuk dengan cepat memeriksa checksum saat mentransfer file besar.

Salah satu yang paling populer adalah keluarga xxHash fungsi hash, yang muncul sekitar lima tahun yang lalu. Meskipun awalnya hash ini disusun untuk memverifikasi checksum selama kompresi LZ4, mereka mulai digunakan pada berbagai tugas. Dapat dimengerti: lihat saja tabel di atas dengan perbandingan kinerja xxHash dan beberapa fungsi hash lainnya. Dalam tes ini, xxHash mengungguli pesaing terdekatnya dalam kinerja hingga setengahnya. Versi baru XXH3 meningkatkan standar.


Selanjutnya, grafik dapat diklik

Penulis program Yann Collet menulis bahwa ide untuk meningkatkan algoritma muncul selama implementasi filter Bloom, yang membutuhkan generasi cepat 64 bit semu secara acak berdasarkan pada data input panjang variabel yang kecil. Pada prinsipnya, standar XXH64 dapat menangani ini, tetapi memproses data input kecil tidak pernah menjadi prioritas dalam pengembangannya. Dengan kata lain, optimasi dimungkinkan. Sebagai hasil dari optimasi ini, fungsi hash baru XXH3 muncul, di mana ide-ide dari beberapa algoritma hash lainnya diimplementasikan. Yang paling menarik, XXH3 secara signifikan lebih cepat dari semua varian xxHash yang ada, tidak hanya pada data input kecil, tetapi di hampir semua kasus penggunaan.

XXH3 menghilangkan kelemahan utama dari XXH64 - pembatasan hash 64 bit. Penulis mengatakan bahwa untuk alasan ini ia sering diminta untuk merilis setidaknya versi 128-bit. Jadi, fungsi hash XXH3 secara teoritis mampu menghasilkan hash hingga 256 bit.

Dalam XXH3, loop dalam yang secara optimal ditangani oleh vektorisasi. Karena itu, fungsi ini menggunakan dukungan perangkat keras pada set instruksi SSE2, AVX2 dan NEON. Kinerja tergantung pada kompiler. Tanpa diduga, versi yang dikompilasi oleh dentang jauh lebih unggul dari yang lain. Ian Colle bahkan berpikir bahwa kinerja fungsi hash di sini akan melebihi bandwidth memori. Versi ini pada grafik sesuai dengan garis putus-putus.



Akibatnya, ternyata fungsi hash dengan dukungan untuk AVX2 memiliki throughput yang jauh lebih tinggi daripada RAM, sehingga ukuran cache menjadi faktor penting. Namun, dalam banyak tugas, penting untuk memproses data yang sudah ada dalam cache, sehingga bekerja dengan kecepatan lebih cepat daripada memori masuk akal.

Dukungan untuk instruksi SSE2 memungkinkan fungsi hash baru untuk secara signifikan menghindari XXH32 pada aplikasi 32-bit yang masih umum di dunia nyata (misalnya, bytecode WASM).



Pada data input kecil (20-30 byte), fungsi hash XXH3 tidak banyak, tetapi masih melampaui CityHash dari Google, serta FarmHash, yang dulunya merupakan pemimpin yang jelas.



Grafik berikut menunjukkan hasil uji paling realistis dengan input data dengan panjang variabel (variabel acak dari 1 hingga N).



Tes lain memperhitungkan penundaan : di sini hashing dimulai pada sinyal. Idenya adalah untuk mensimulasikan beban kerja nyata, di mana fungsi hash tidak bekerja terus menerus, tetapi dipanggil dalam proses lain pada saat tertentu.



Penulis menulis bahwa tes ini dengan perkalian 64 × 64 => 128 bit lebih memilih algoritma mumv2 dari Vladimir Makarov dan t1ha2 dari Leo Yuryev.



Akhirnya, di sini adalah grafik terakhir dan paling penting yang menunjukkan tingkat hash pada data input dengan panjang variabel, dengan mempertimbangkan penundaan. Ini mencerminkan penggunaan aktual dari fungsi hash, misalnya, dalam database.



XXH3 dirilis sebagai bagian dari paket xxHash v0.7.0 . Itu memiliki tanda "percobaan", dan untuk membuka kunci Anda harus menggunakan makro XXH_STATIC_LINKING_ONLY . Penulis menjelaskan bahwa fungsi hash sejauh ini hanya dapat digunakan pada data sementara pengujian, tetapi tidak untuk penyimpanan hash yang sebenarnya. Menurut hasil periode eksperimental dan pengumpulan ulasan pengguna, fungsi XXH3 akan menerima status stabil di versi xxHash berikutnya.





Source: https://habr.com/ru/post/id444144/


All Articles