เพิ่มจำนวนเวทย์มนตร์ :: hash_combine


97

boost::hash_combineฟังก์ชั่นแม่แบบใช้การอ้างอิงถึงกัญชา (เรียกว่าseed) vและวัตถุ ตามเอกสารมันรวมseedกับแฮชของvโดย

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);

ฉันเห็นว่านี่เป็นปัจจัยกำหนด ฉันเห็นสาเหตุที่ใช้ XOR

ฉันพนันได้เลยว่าการเพิ่มจะช่วยในการทำแผนที่ค่าที่คล้ายกันออกจากกันอย่างกว้างขวางดังนั้นตารางแฮชการตรวจสอบจะไม่พังทลาย แต่มีใครอธิบายได้ไหมว่าค่าคงที่ของเวทมนตร์คืออะไร


เนื่องจากในคอมพิวเตอร์หลาย ๆ เครื่องจำนวนเต็มหมุนเวียนมีต้นทุนใกล้เคียงกับกะจะมีประโยชน์ในการแปลงนิพจน์เป็น: <code> seed ^ = hash_value (v) + 0x9e3779b9 + rotl (seed, 6) + rotr (seed, 2); </code>
John Yates

คำตอบ:


143

จำนวนเวทย์มนตร์ควรเป็น 32 บิตสุ่มโดยที่แต่ละบิตมีความเป็นไปได้ที่จะเป็น 0 หรือ 1 เท่า ๆ กันและไม่มีความสัมพันธ์ระหว่างบิต วิธีทั่วไปในการค้นหาสตริงของบิตดังกล่าวคือการใช้การขยายฐานสองของจำนวนอตรรกยะ ในกรณีนี้ตัวเลขนั้นคือส่วนต่างของอัตราส่วนทองคำ:

phi = (1 + sqrt(5)) / 2
2^32 / phi = 0x9e3779b9

ดังนั้นการรวมตัวเลขนี้ "สุ่ม" จะเปลี่ยนเมล็ดพันธุ์แต่ละบิต อย่างที่คุณพูดนั่นหมายความว่าค่าที่ต่อเนื่องกันจะห่างกัน การรวมเมล็ดพันธุ์เก่าที่มีการเปลี่ยนแปลงทำให้แน่ใจว่าแม้ว่าจะhash_value()มีช่วงค่าที่ค่อนข้างเล็ก แต่ความแตกต่างจะกระจายไปทั่วทุกบิตในไม่ช้า


15
เย็น! ฉันชอบมันเมื่อทฤษฎีจำนวนมีประโยชน์ในทันใด :)
Fred Foo

8
@larsmans ฉันชอบที่คุณใช้ 'กะทันหัน' - มันเหมาะสมมาก! ทฤษฎีจำนวนก็เหมือนกับ "ใช่นั่นเป็นเรื่องดี ... แต่ฉันมีงานจริงที่ต้องทำขอโทษ" ใน 99% ของทุกกรณี แล้วอย่างที่คุณพูดว่า 'ทันใดนั้น' ทฤษฎีจำนวนนั้นมีประโยชน์อย่างยิ่ง มันไม่เหมือนกับค้อนที่มันค่อนข้างมีประโยชน์สำหรับสิ่งของจำนวนมาก แต่มันเหมือนกับมีดผ่าตัดที่มีประโยชน์อย่างยิ่งสำหรับสิ่งเล็ก ๆ น้อย ๆ
corsiKa

5
@SamKellett จะทำงานได้ดียิ่งขึ้นถ้าคุณใช้จำนวนวงเล็บที่ถูกต้องและได้รับ0x9e3779b97f4a7800
Barry

5
เนื่องจากเลขทศนิยมของ Python ไม่มีความแม่นยำเพียงพออัตราส่วนทองคำ 64 บิตด้านบนจึงไม่ถูกต้อง 0x9e3779b97f4a7c15ผลที่เกิดขึ้นจริงที่ควรจะเป็น
kennytm

1
@kennytm คุณไม่ได้หมายถึง0x9e3779b97f4a7c16? ฉันหมายความว่ามันเป็นเพียง 1 ปิด
bit2shift

25

ลองดูที่เป็นบทความ DDJ โดยบ๊อบเจนกินส์จาก 1997 ค่าคงที่วิเศษ ("อัตราส่วนทองคำ") อธิบายได้ดังนี้:

อัตราส่วนทองคำเป็นมูลค่าโดยพลการ วัตถุประสงค์คือเพื่อหลีกเลี่ยงการแมปเลขศูนย์ทั้งหมดกับศูนย์ทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.