Seringkali berguna untuk keperluan pencatatan dalam aplikasi real-time seperti game untuk memberi setiap entitas nama. Ini membuat pelacakan kesalahan lebih mudah karena menemukan entitas melalui nama unik lebih mudah daripada melihat angka unik atau bentuk pengidentifikasi lainnya. Tetapi string sangat besar dan menyalin dan membandingkannya lambat, sehingga mereka sering tidak dapat digunakan dalam kode kritis kinerja.
Salah satu solusi adalah string hash yang hanya bilangan bulat dan dengan demikian kecil, cepat untuk disalin dan dibandingkan. Tapi hash tidak mengizinkan mengambil nilai string asli yang persis seperti yang dibutuhkan untuk tujuan logging dan debugging! Selain itu, ada kemungkinan tabrakan, jadi kode hash yang setara tidak selalu berarti string yang sama. Kesempatan ini kecil, tetapi sumber yang sulit ditemukan bug.
Solusi lain adalah string magang. String Interning menggunakan tabel pencarian global di mana setiap string disimpan hanya sekali dan direferensikan melalui indeks atau sesuatu yang serupa. Menyalin dan membandingkan juga cepat, tetapi mereka masih belum sempurna: Anda hanya dapat mengaksesnya saat runtime. Mendapatkan nilai pada waktu kompilasi misalnya untuk sakelar tidak dimungkinkan.
Jadi di satu sisi kami ingin pengidentifikasi yang cepat dan ringan tetapi di sisi lain juga metode untuk mendapatkan nama kembali.
Perpustakaan open source ini memberikan campuran antara dua solusi dalam bentuk kelas string_id . Setiap objek menyimpan nilai string hash dan pointer ke database di mana nilai string asli disimpan. Ini memungkinkan pengambilan nilai string saat dibutuhkan sambil juga mendapatkan manfaat kinerja dari string hash. Selain itu, database dapat mendeteksi tabrakan yang dapat ditangani melalui penangan tabrakan khusus. Ada literal yang ditentukan pengguna untuk membuat nilai string hashed-time untuk menggunakannya sebagai ekspresi konstan.
Basis data dapat berupa tipe yang ditentukan pengguna yang berasal dari kelas antarmuka tertentu. Ada beberapa database yang telah ditentukan sebelumnya. Ini termasuk database dummy yang tidak menyimpan apa pun, adaptor untuk database lain untuk menjadikannya ThreadSafe dan database yang sangat dioptimalkan untuk penyimpanan dan pengambilan string yang efisien. Typedef default_database adalah salah satu basis data tersebut dan dapat diatur melalui opsi CMake berikut:
Foonathan_string_id_database - Jika mati , database dinonaktifkan sepenuhnya, misalnya database dummy digunakan. Ini tidak memungkinkan pengambilan string atau pemeriksaan tabrakan tetapi tidak memerlukan banyak memori. Itu aktif secara default.
Foonathan_string_id_multithreaded - jika aktif , akses basis data akan disinkronkan melalui mutex, misalnya adaptor aman utas akan digunakan. Tidak berpengaruh jika database dinonaktifkan. Nilai default aktif .
Ada kelas generator khusus. Mereka memiliki antarmuka yang sama dengan generator angka acak di pustaka standar, tetapi menghasilkan pengidentifikasi string. Ini digunakan untuk menghasilkan banyak pengidentifikasi secara otomatis. Generator juga berhati -hati bahwa selalu ada pengidentifikasi baru yang dihasilkan. Ini dapat dikontrol melalui pawang yang mirip dengan penanganan tabrakan juga.
Lihat Contoh/Main.cpp Sebagai contoh.
Saat ini menggunakan hash FNV-1A 64bit. Tabrakan sangat jarang, saya telah menguji 219.606 kata -kata bahasa Inggris (dalam huruf kecil) yang dicampur dengan banyak angka dan tidak menghadapi tabrakan tunggal. Karena ini adalah kasus penggunaan normal untuk pengidentifikasi, fungsi hash cukup bagus. Selain itu, ada distribusi yang baik dari nilai hash dan mudah untuk dihitung.
Basis data menggunakan tabel hash khusus. Tabrakan indeks bucket diselesaikan melalui rantai terpisah dengan daftar tertaut tunggal. Setiap node berisi string secara langsung tanpa alokasi memori tambahan. Node pada daftar tertaut diurutkan menggunakan nilai hash. Ini memungkinkan pengambilan dan memeriksa secara efisien apakah sudah ada string dengan nilai hash yang sama yang disimpan. Ini membuatnya sangat efisien dan lebih cepat dari std :: unordered_map yang digunakan sebelumnya (setidaknya lebih cepat dari implementasi libstdc ++ yang telah saya gunakan untuk tolok ukur).
Perpustakaan ini telah dikompilasi di bawah kompiler berikut:
Ada opsi kompatibilitas dan penggantian marcos untuk constexpr, noexcept, override dan operator literal. Fungsi pawang atom dapat dinonaktifkan secara opsional dan tidak aktif untuk GCC 4.6 secara default karena tidak mendukungnya.