XXH3: حامل سجل سرعة تجزئة جديد


المقاييس التي تم إجراؤها في برنامج SMHasher على Core 2 Duo 3.0 جيجاهرتز

تحدث هابري مرارًا وتكرارًا عن وظائف التجزئة غير المشفرة ، والتي تعد بترتيب من حيث حجمها أسرع من تلك الموجودة في التشفير. يتم استخدامها حيث تكون السرعة مهمة ولا معنى لاستخدام MD5 أو SHA1 البطيء. على سبيل المثال ، لإنشاء جداول تجزئة مع تخزين أزواج ذات قيمة مفتاح أو للتحقق بسرعة من المجموع الاختباري عند نقل الملفات الكبيرة.

واحدة من الأكثر شعبية هي عائلة xxHash من وظائف التجزئة ، والتي ظهرت قبل حوالي خمس سنوات. على الرغم من أن هذه التجزئات كانت في البداية مصممة للتحقق من المجموع الاختباري أثناء ضغط LZ4 ، إلا أنها بدأت تستخدم في مجموعة متنوعة من المهام. إنه أمر مفهوم: فقط انظر إلى الجدول أعلاه بمقارنة أداء xxHash وبعض وظائف التجزئة الأخرى. في هذا الاختبار ، يتفوق xxHash على أقرب منافس له في الأداء بمقدار النصف. الإصدار الجديد من XXH3 يرفع الشريط أعلى.


فيما يلي ، المخططات قابلة للنقر

يكتب مؤلف البرنامج Yann Collet أن فكرة تحسين الخوارزمية جاءت أثناء تنفيذ مرشح Bloom ، الذي تطلب توليدًا سريعًا من 64 بت عشوائي عشوائي بناءً على بيانات إدخال صغيرة متغيرة الطول. من حيث المبدأ ، يمكن لـ XXH64 القياسية التعامل مع هذا ، لكن معالجة بيانات الإدخال الصغيرة لم تكن أبدًا أولوية في تطويرها. بمعنى آخر ، التحسين ممكن. نتيجة لهذا التحسين ، ظهرت دالة تجزئة جديدة XXH3 ، حيث يتم تنفيذ أفكار من خوارزميات تجزئة أخرى. الأكثر إثارة للاهتمام ، أن XXH3 أسرع بكثير من جميع المتغيرات xxHash الحالية ، ليس فقط على بيانات الإدخال الصغيرة ، ولكن في جميع حالات الاستخدام تقريبًا.

يحل XXH3 العيب الرئيسي لـ XXH64 - حد تجزئة 64 بت. يقول المؤلف إنه لهذا السبب طُلب منه غالبًا إصدار 128 بت على الأقل. لذلك ، فإن دالة تجزئة XXH3 قادرة نظريًا على توليد تجزئات تصل إلى 256 بت.

في XXH3 ، حلقة داخلية يتم التعامل معها بالشكل الأمثل عن طريق التحويل. نتيجة لهذا ، تستخدم الوظيفة دعم الأجهزة في مجموعات التعليمات SSE2 و AVX2 و NEON. يعتمد الأداء على المترجم. بشكل غير متوقع ، النسخة التي جمعتها clang أعلى بكثير من البقية. إيان كول اعتقد حتى أن أداء وظيفة التجزئة هنا سوف يتجاوز عرض النطاق الترددي الذاكرة. يتوافق هذا الإصدار على الرسم البياني مع خط متقطع.



ونتيجة لذلك ، اتضح أن وظيفة التجزئة مع دعم AVX2 لها إنتاجية أعلى بكثير من ذاكرة الوصول العشوائي ، وبالتالي يصبح حجم ذاكرة التخزين المؤقت عاملاً مهماً. ومع ذلك ، في العديد من المهام ، من الضروري معالجة البيانات الموجودة بالفعل في ذاكرة التخزين المؤقت ، وبالتالي فإن العمل بسرعة أكبر من سرعة الذاكرة أمر منطقي.

يتيح دعم إرشادات SSE2 لدالة التجزئة الجديدة التحايل بشكل كبير على XXH32 على تطبيقات 32 بت التي لا تزال شائعة في العالم الحقيقي (على سبيل المثال ، رمز WASM).



بالنسبة إلى بيانات الإدخال الصغيرة (20-30 بايت) ، فإن دالة تجزئة XXH3 ليست كبيرة ، ولكنها لا تزال تتجاوز CityHash من Google ، وكذلك FarmHash ، التي كانت رائدة في هذا المجال.



يوضح الرسم البياني التالي نتائج الاختبار الأكثر واقعية مع إدخال بيانات ذات طول متغير (متغير عشوائي من 1 إلى N).



اختبار آخر يأخذ في الاعتبار التأخير : هنا تبدأ التجزئة على إشارة. تتمثل الفكرة في محاكاة عبء عمل حقيقي ، حيث لا تعمل وظيفة التجزئة بشكل مستمر ، ولكن يتم استدعاؤها في عمليات أخرى في لحظة معينة.



يكتب المؤلف أن هذا الاختبار بضرب 64 × 64 => 128 بت تفضل خوارزميات mumv2 من فلاديمير ماكاروف و t1ha2 من ليو يورييف.



أخيرًا ، فيما يلي الرسم البياني النهائي والأهم الذي يوضح معدل التجزئة على بيانات الإدخال ذات الطول المتغير ، مع مراعاة التأخير. يعكس الاستخدام الفعلي لوظيفة التجزئة ، على سبيل المثال ، في قواعد البيانات.



تم إصدار XXH3 كجزء من حزمة xxHash v0.7.0 . يحتوي على علامة "تجريبية" ، XXH_STATIC_LINKING_ONLY تحتاج إلى استخدام الماكرو XXH_STATIC_LINKING_ONLY . يوضح المؤلف أن دالة التجزئة حتى الآن لا يمكن استخدامها إلا في اختبار بيانات سريعة الزوال ، ولكن ليس للتخزين الفعلي للتجزئة. وفقًا لنتائج الفترة التجريبية ومجموعة مراجعات المستخدم ، ستحصل الدالة XXH3 على حالة مستقرة في الإصدار التالي من xxHash.





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


All Articles