ทำไมทูเปิล (set ([1,“ a”,“ b”,“ c”,“ z”,“ f”])) == tuple (set ([“ a”,“ b”,“ c”, “ z”,“ f”, 1])) 85% ของเวลาที่เปิดใช้งานการสุ่มแฮช?


97

เมื่อได้รับคำตอบของ Zero Piraeus สำหรับคำถามอื่นเรามีสิ่งนั้น

x = tuple(set([1, "a", "b", "c", "z", "f"]))
y = tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)

พิมพ์Trueประมาณ 85% ของเวลาที่เปิดใช้งานการสุ่มแฮช ทำไมถึง 85%?

คำตอบ:


128

ฉันจะถือว่าผู้อ่านคำถามนี้อ่านทั้งสองอย่าง:

สิ่งแรกที่ควรทราบก็คือการสุ่มแฮชจะตัดสินใจในการเริ่มต้นล่าม

แฮชของแต่ละตัวอักษรจะเหมือนกันสำหรับทั้งสองชุดดังนั้นสิ่งเดียวที่สำคัญก็คือหากมีการชนกัน (ซึ่งคำสั่งจะได้รับผลกระทบ)


โดยการหักของลิงก์ที่สองนั้นเรารู้ว่าอาร์เรย์สำรองสำหรับชุดเหล่านี้เริ่มต้นที่ความยาว 8:

_ _ _ _ _ _ _ _

ในกรณีแรกเราแทรก1:

_ 1 _ _ _ _ _ _

จากนั้นใส่ส่วนที่เหลือ:

α 1 ? ? ? ? ? ?

จากนั้นปรับขนาดเป็นขนาด 32:

    1 can't collide with α as α is an even hash
  ↓ so 1 is inserted at slot 1 first
? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

ในกรณีที่สองเราใส่ส่วนที่เหลือ:

? β ? ? ? ? ? ?

แล้วลองแทรก 1:

    Try to insert 1 here, but will
  ↓ be rehashed if β exists
? β ? ? ? ? ? ?

จากนั้นจะถูกปรับปรุงใหม่:

    Try to insert 1 here, but will
    be rehashed if β exists and has
  ↓ not rehashed somewhere else
? β ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

ดังนั้นคำสั่งการวนซ้ำจะแตกต่างกันหรือไม่นั้นขึ้นอยู่กับว่ามีβอยู่หรือไม่


โอกาสของβคือโอกาสที่ตัวอักษร 5 ตัวใด ๆ จะแฮชเป็น 1 โมดูโล 8 และแฮชเป็น 1 โมดูโล 32

เนื่องจากอะไรก็ตามที่แฮชถึง 1 โมดูโล 32 ก็แฮชถึง 1 โมดูโล 8 เราจึงต้องการหาโอกาสที่ช่อง 32 ช่องหนึ่งในห้าอยู่ในช่องที่ 1:

5 (number of letters) / 32 (number of slots)

5/32 เป็น 0.15625 เพื่อให้มีความเป็นchance¹ 15.625% ของคำสั่งที่ถูกที่แตกต่างกันระหว่างสองชุดก่อสร้าง


ไม่แปลกเลยนี่คือสิ่งที่ Zero Piraeus วัดได้


¹ในทางเทคนิคแม้จะไม่ชัดเจน เราสามารถแสร้งทำเป็นแฮชทุกๆ 5 อันโดยไม่ซ้ำกันเนื่องจากการแฮชใหม่ แต่เนื่องจากการตรวจสอบเชิงเส้นจึงมีแนวโน้มที่โครงสร้าง "มัด" จะเกิดขึ้นมากกว่า ... ไม่ส่งผลกระทบต่อเราจริง

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