غالبًا ما يكون من المفيد لأغراض التسجيل في التطبيقات في الوقت الفعلي مثل الألعاب لمنح كل كيان اسمًا. هذا يجعل تعقب الأخطاء أسهل لأن العثور على كيانات عبر أسماء فريدة أسهل من النظر إلى أرقام فريدة أو أشكال أخرى من المعرفات. لكن الأوتار ضخمة ونسخها ومقارنتها بطيئة ، لذلك لا يمكن استخدامها غالبًا في الشفرة الحرجة للأداء.
أحد الحلول هي سلاسل التجزئة التي ليست سوى أعداد صحيحة وبالتالي صغيرة وسريعة للنسخ والمقارنة. لكن التجزئة لا تسمح باسترداد قيمة السلسلة الأصلية وهو بالضبط ما هو مطلوب لأغراض تسجيل وتصحيح الأخطاء! بالإضافة إلى ذلك ، هناك فرصة للتصادم ، لذا فإن رمز التجزئة المتساوي لا يعني بالضرورة سلاسل متساوية. هذه الفرصة صغيرة ، ولكن مصدر يصعب العثور عليه.
حل آخر هو سلسلة متداخلة. يستخدم Interning Interning جدول بحث عالمي حيث يتم تخزين كل سلسلة مرة واحدة فقط ويتم الرجوع إليها عبر فهرس أو شيء مشابه. النسخ والمقارنة سريع أيضًا ، لكنها لا تزال غير مثالية: لا يمكنك الوصول إليها إلا في وقت التشغيل. لا يمكن الحصول على القيمة في وقت الترجمة على سبيل المثال للمفتاح.
لذلك من ناحية ، نريد معرفات سريعة وخفيفة الوزن ولكن من ناحية أخرى ، أيضًا طرق لاستعادة الاسم.
توفر مكتبة المصدر المفتوحة هذه مزيجًا بين الحلين في شكل سلسلة string_id . يقوم كل كائن بتخزين قيمة سلسلة التجزئة ومؤشر إلى قاعدة البيانات التي يتم فيها تخزين قيمة السلسلة الأصلية. يسمح هذا باسترداد قيمة السلسلة عند الحاجة مع الحصول على مزايا الأداء من سلاسل التجزئة. بالإضافة إلى ذلك ، يمكن لقاعدة البيانات اكتشاف التصادمات التي يمكن معالجتها عبر معالج التصادم المخصص. هناك حرفي محدد من قبل المستخدم لإنشاء قيمة سلسلة التجزئة في وقت الترجمة لاستخدامها كتعبير ثابت.
يمكن أن تكون قاعدة البيانات أي نوع محدد من قبل المستخدم مشتق من فئة واجهة معينة. هناك العديد من قواعد البيانات المحددة مسبقًا. يتضمن ذلك قاعدة بيانات وهمية لا تخزن أي شيء ، وهو محول لقواعد البيانات الأخرى لجعلها آمنة مؤشرات الترابط وقاعدة بيانات محسّنة للغاية لتخزين السلاسل واستردادها الفعالة. يعد Typedef default_database أحد قواعد البيانات ويمكن تعيينه عبر خيارات CMake التالية:
foonathan_string_id_database - إذا تم إيقاف تشغيله ، يتم تعطيل قاعدة البيانات تمامًا ، على سبيل المثال ، يتم استخدام قاعدة البيانات الوهمية. هذا لا يسمح باسترداد السلاسل أو فحص التصادم ولكن لا يحتاج إلى الكثير من الذاكرة. إنه بشكل افتراضي .
foonathan_string_id_multitherdered - إذا تم تشغيله ، فسيتم مزامنة الوصول إلى قاعدة البيانات عبر mutex ، على سبيل المثال ، سيتم استخدام محول آمن مؤشر الترابط. ليس له أي تأثير إذا تم تعطيل قاعدة البيانات. القيمة الافتراضية قيد التشغيل .
هناك فصول المولدات الخاصة. لديهم واجهة مماثلة لمولدات الأرقام العشوائية في المكتبات القياسية ، ولكن إنشاء معرفات السلسلة. يستخدم هذا لإنشاء مجموعة من المعرفات بطريقة آلية. يحرص المولدات أيضًا على وجود معرفات جديدة يتم إنشاؤها. يمكن التحكم في ذلك عبر معالج مشابه لمعالجة التصادم أيضًا.
انظر المثال/main.cpp للحصول على مثال.
ويستخدم حاليًا علامة تجزئة FNV-1A 64bit. التصادمات نادرة حقًا ، لقد اختبرت 219،606 كلمة إنجليزية (في حالة صغيرة) مختلطة مع مجموعة من الأرقام ولم أواجه تصادمًا واحدًا. نظرًا لأن هذه هي حالة الاستخدام العادي للمعرفات ، فإن وظيفة التجزئة جيدة جدًا. بالإضافة إلى ذلك ، هناك توزيع جيد لقيم التجزئة ومن السهل حسابه.
تستخدم قاعدة البيانات جدول التجزئة المتخصص. يتم حل تصادمات مؤشر دلو عبر تسلسل منفصل مع قائمة واحدة مرتبطة. تحتوي كل عقدة على السلسلة مباشرة دون تخصيص ذاكرة إضافية. يتم فرز العقد في القائمة المرتبطة باستخدام قيمة التجزئة. يتيح ذلك استردادًا فعالًا والتحقق مما إذا كانت هناك بالفعل سلسلة ذات قيمة التجزئة نفسها المخزنة. هذا يجعلها فعالة للغاية وأسرع من std :: unordered_map التي تم استخدامها من قبل (على الأقل أسرع من تطبيق libstdc ++ الذي استخدمته في المعايير).
تم تجميع هذه المكتبة تحت المجمعين التاليين:
هناك خيارات التوافق واستبدال marcos ل constexpr ، noExcept ، Override و Listarports. يمكن تعطيل وظائف المعالج الذري اختياريا ويتم إيقاف تشغيلها في GCC 4.6 بشكل افتراضي لأنها لا تدعمها.