ฉันต้องการใช้ตารางแฮชที่กระจายอย่างรวดเร็วใน C # ฉันมีปัญหาในการเลือกฟังก์ชั่นแฮช จำกัด ของฉันที่ใช้รหัสแฮชตามอำเภอใจและ "จำกัด " มันเพื่อให้สามารถใช้สร้างดัชนีถังได้ มีสองตัวเลือกที่ฉันเห็น:
ในมือข้างหนึ่งคุณสามารถตรวจสอบให้แน่ใจว่าถังของคุณมีองค์ประกอบจำนวนมากเสมอและเพื่อ จำกัด การแฮชคุณเพียงแค่ปรับค่าตามจำนวนถัง นี่คือความจริงแล้วพจนานุกรมของ. NET ทำอะไร ปัญหาของวิธีนี้คือการใช้% ช้ามากเมื่อเทียบกับการปฏิบัติการอื่น ถ้าคุณมองไปที่ตารางการเรียนการสอน Agner ตัดหมอก ,
idiv
(ซึ่งเป็นรหัสการชุมนุมที่ได้รับการสร้างขึ้นสำหรับ%) มีการเรียนการสอนแฝง ~ 25 รอบสำหรับโปรเซสเซอร์ Intel ใหม่ เปรียบเทียบนี้เพื่อรอบ 3mul
หรือ 1 สำหรับ Ops บิตเช่นand
, หรือor
xor
ในทางกลับกันคุณสามารถมีจำนวนของถังเสมอได้ 2 คุณยังจะต้องคำนวณโมดูลัสของแฮชดังนั้นคุณจึงไม่ได้พยายามทำดัชนีนอกอาร์เรย์ แต่คราวนี้มันจะมีราคาไม่แพง . เนื่องจากกำลังของ 2
% N
เป็นเพียง& (N - 1)
ข้อ จำกัด จึงลดลงเป็นการดำเนินการปิดบังซึ่งใช้เวลาเพียง 1-2 รอบเท่านั้น นี้จะกระทำโดยsparsehash ของ Google ข้อเสียของสิ่งนี้คือเรากำลังไว้ใจผู้ใช้เพื่อให้แฮชดี การปิดบังแฮชจะตัดส่วนของแฮชออกเป็นส่วนใหญ่ดังนั้นเราจะไม่คำนึงถึงบิตของแฮชทั้งหมดอีกต่อไป หากแฮชของผู้ใช้มีการกระจายอย่างไม่สม่ำเสมอตัวอย่างเช่นบิตที่สูงกว่าจะถูกเติมเต็มหรือบิตที่ต่ำกว่านั้นจะเท่ากันเสมอวิธีการนี้จะมีอัตราการชนที่สูงกว่ามาก
ฉันกำลังมองหาอัลกอริทึมที่ฉันสามารถใช้ได้ซึ่งมีทั้งสองอย่างที่ดีที่สุดในโลก: มันต้องคำนึงถึงบิตทั้งหมดของการแฮชและยังเร็วกว่าการใช้% ไม่จำเป็นต้องเป็นโมดูลัสเพียงบางสิ่งที่รับประกันว่าจะอยู่ในช่วง0..N-1
(โดยที่ N คือความยาวของที่เก็บข้อมูล) และมีการแจกแจงที่สม่ำเสมอสำหรับช่องทั้งหมด อัลกอริทึมดังกล่าวมีอยู่จริงหรือไม่?
ขอบคุณสำหรับการช่วยเหลือ.
(2^N +/- 1)
ดูstackoverflow.com/questions/763137/…