มันมักจะมีประโยชน์สำหรับการบันทึกวัตถุประสงค์ในแอปพลิเคชันแบบเรียลไทม์เช่นเกมเพื่อให้ชื่อแต่ละเอนทิตี สิ่งนี้ทำให้การติดตามข้อผิดพลาดง่ายขึ้นเนื่องจากการค้นหาเอนทิตีผ่านชื่อที่ไม่ซ้ำกันนั้นง่ายกว่าการดูตัวเลขที่ไม่ซ้ำกันหรือตัวระบุรูปแบบอื่น ๆ แต่สตริงมีขนาดใหญ่และการคัดลอกและการเปรียบเทียบนั้นช้าดังนั้นพวกเขาจึงไม่สามารถใช้ในรหัสวิกฤตประสิทธิภาพได้
โซลูชันหนึ่งคือสตริงแฮชซึ่งเป็นเพียงจำนวนเต็มเท่านั้นและมีขนาดเล็กและเร็วในการคัดลอกและเปรียบเทียบ แต่แฮชไม่อนุญาตให้ดึงค่าสตริงดั้งเดิมซึ่งเป็นสิ่งที่จำเป็นสำหรับการบันทึกและการดีบัก! นอกจากนี้ยังมีโอกาสชนกันดังนั้นรหัสแฮชที่เท่าเทียมกันจึงไม่ได้หมายถึงสตริงที่เท่าเทียมกัน โอกาสนี้มีขนาดเล็ก แต่เป็นแหล่งหาข้อบกพร่องที่หายาก
ทางออกอื่นคือการแทรกแซงสตริง String Interning ใช้ตารางค้นหาทั่วโลกที่แต่ละสตริงจะถูกเก็บไว้เพียงครั้งเดียวและอ้างอิงผ่านดัชนีหรือสิ่งที่คล้ายกัน การคัดลอกและการเปรียบเทียบนั้นรวดเร็วเช่นกัน แต่ก็ยังไม่สมบูรณ์แบบ: คุณสามารถเข้าถึงได้ในรันไทม์เท่านั้น ไม่สามารถรับค่าที่คอมไพล์ได้เวลาเช่นสำหรับสวิตช์เป็นไปไม่ได้
ดังนั้นในอีกด้านหนึ่งเราต้องการตัวระบุที่รวดเร็วและมีน้ำหนักเบา แต่ในทางกลับกันยังมีวิธีที่จะได้รับชื่อกลับมา
ไลบรารีโอเพ่นซอร์สนี้ให้การผสมผสานระหว่างสองโซลูชันในรูปแบบของคลาส String_id แต่ละวัตถุจะเก็บค่าสตริงแฮชและตัวชี้ไปยังฐานข้อมูลที่เก็บค่าสตริงดั้งเดิมไว้ สิ่งนี้ช่วยให้สามารถดึงค่าสตริงได้เมื่อจำเป็นในขณะที่ยังได้รับประโยชน์จากประสิทธิภาพจากสตริงแฮช นอกจากนี้ฐานข้อมูลสามารถตรวจจับการชนที่สามารถจัดการได้ผ่านตัวจัดการการชนที่กำหนดเอง มีตัวอักษรที่ผู้ใช้กำหนดไว้เพื่อสร้างค่าสตริงแฮช-เวลาคอมไพล์เพื่อใช้เป็นนิพจน์คงที่
ฐานข้อมูลสามารถเป็นประเภทที่ผู้ใช้กำหนดได้จากคลาสอินเตอร์เฟสที่แน่นอน มีฐานข้อมูลที่กำหนดไว้ล่วงหน้าหลายแห่ง ซึ่งรวมถึงฐานข้อมูลดัมมี่ที่ไม่ได้เก็บอะไรอะแดปเตอร์สำหรับฐานข้อมูลอื่น ๆ เพื่อให้เธรดพวกเขาต้องการและฐานข้อมูลที่ได้รับการปรับปรุงอย่างสูงสำหรับการจัดเก็บและดึงสตริงที่มีประสิทธิภาพ typedef default_database เป็นหนึ่งในฐานข้อมูลเหล่านั้นและสามารถตั้งค่าผ่านตัวเลือก CMake ต่อไปนี้:
foonathan_string_id_database - ถ้า ปิด ฐานข้อมูลจะถูกปิดใช้งานอย่างสมบูรณ์เช่นฐานข้อมูลจำลองจะถูกใช้ สิ่งนี้ไม่อนุญาตให้ดึงสตริงหรือการตรวจสอบการชนกัน แต่ไม่ต้องการหน่วยความจำมากนัก มันอยู่โดยค่าเริ่ม ต้น
foonathan_string_id_multithreaded - ถ้า เปิด การเข้าถึงฐานข้อมูลจะถูกซิงโครไนซ์ผ่าน mutex เช่นอะแดปเตอร์ที่ปลอดภัยของเธรดจะถูกใช้ ไม่มีผลถ้าฐานข้อมูลถูกปิดใช้งาน ค่าเริ่มต้น เปิดอยู่
มีคลาสเครื่องกำเนิดไฟฟ้าพิเศษ พวกเขามีอินเทอร์เฟซที่คล้ายกันกับเครื่องกำเนิดตัวเลขสุ่มในไลบรารีมาตรฐาน แต่สร้างตัวระบุสตริง สิ่งนี้ใช้เพื่อสร้างตัวระบุจำนวนมากในแบบอัตโนมัติ เครื่องกำเนิดไฟฟ้ายังดูแลว่ามีตัวระบุใหม่ที่สร้างขึ้นเสมอ สิ่งนี้สามารถควบคุมได้ผ่านตัวจัดการที่คล้ายกับการจัดการการชนเช่นกัน
ดูตัวอย่าง/main.cpp สำหรับตัวอย่าง
ปัจจุบันใช้แฮช FNV-1A 64 บิต การชนกันหายากจริง ๆ ฉันได้ทดสอบคำภาษาอังกฤษ 219,606 คำ (ในตัวพิมพ์เล็ก) ผสมกับตัวเลขจำนวนมากและไม่พบการปะทะกันครั้งเดียว เนื่องจากนี่เป็นกรณีการใช้งานปกติสำหรับตัวระบุฟังก์ชั่นแฮชจึงค่อนข้างดี นอกจากนี้ยังมีการกระจายที่ดีของค่าแฮชและเป็นเรื่องง่ายที่จะคำนวณ
ฐานข้อมูลใช้ตารางแฮชพิเศษ การชนของดัชนีถังได้รับการแก้ไขผ่านการผูกมัดแยกต่างหากด้วยรายการที่เชื่อมโยงเดียว แต่ละโหนดมีสตริงโดยตรงโดยไม่มีการจัดสรรหน่วยความจำเพิ่มเติม โหนดในรายการที่เชื่อมโยงจะถูกเรียงลำดับโดยใช้ค่าแฮช สิ่งนี้ช่วยให้การดึงและตรวจสอบมีประสิทธิภาพว่ามีสตริงที่มีค่าแฮชเดียวกันอยู่แล้วหรือไม่ สิ่งนี้ทำให้มีประสิทธิภาพและเร็วกว่า STD :: Unorded_map ที่ใช้มาก่อน (อย่างน้อยก็เร็วกว่าการใช้งาน LibSTDC ++ ที่ฉันใช้สำหรับมาตรฐาน)
ไลบรารีนี้รวบรวมภายใต้คอมไพเลอร์ต่อไปนี้:
มีตัวเลือกความเข้ากันได้และการเปลี่ยนมาร์กอสสำหรับ constexpr, noexcept, override และตัวอักษรตัวอักษร ฟังก์ชั่น Handler Atomic สามารถปิดการใช้งานได้ทางเลือกและปิดสำหรับ GCC 4.6 โดยค่าเริ่มต้นเนื่องจากไม่รองรับ