Tại sao tuple (set ([1, “a”, “b”, “c”, “z”, “f”])) == tuple (set ([“a”, “b”, “c”, “Z”, “f”, 1])) 85% thời gian có bật ngẫu nhiên băm?


Câu trả lời:


128

Tôi sẽ giả sử bất kỳ độc giả nào của câu hỏi này đã đọc cả hai:

Điều đầu tiên cần lưu ý là ngẫu nhiên băm được quyết định khi khởi động trình thông dịch.

Hàm băm của mỗi chữ cái sẽ giống nhau cho cả hai bộ, vì vậy điều duy nhất có thể quan trọng là nếu có va chạm (nơi thứ tự sẽ bị ảnh hưởng).


Bằng cách suy diễn của liên kết thứ hai đó, chúng ta biết mảng hỗ trợ cho các tập hợp này bắt đầu ở độ dài 8:

_ _ _ _ _ _ _ _

Trong trường hợp đầu tiên, chúng tôi chèn 1:

_ 1 _ _ _ _ _ _

và sau đó chèn phần còn lại:

α 1 ? ? ? ? ? ?

Sau đó, nó được băm lại thành kích thước 32:

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

Trong trường hợp thứ hai, chúng tôi chèn phần còn lại:

? β ? ? ? ? ? ?

Và sau đó cố gắng chèn 1:

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

Và sau đó nó sẽ được băm lại:

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

Vì vậy, liệu các lệnh lặp có khác nhau hay không chỉ phụ thuộc vào việc có tồn tại β hay không.


Cơ hội của một β là cơ hội mà bất kỳ chữ cái nào trong số 5 chữ cái sẽ băm thành 1 modulo 8 băm thành 1 modulo 32.

Vì bất kỳ thứ gì băm thành 1 modulo 32 cũng băm thành 1 modulo 8, chúng tôi muốn tìm cơ hội trong số 32 vị trí, một trong năm vị trí ở vị trí 1:

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

5/32 là 0,15625, do đó, có 15,625% cơ hội¹ các đơn đặt hàng khác nhau giữa hai cấu trúc đã đặt .


Không lạ lùng chút nào, đây chính xác là những gì Zero Piraeus đo được.


¹ Về mặt kỹ thuật, điều này không rõ ràng. Chúng ta có thể giả sử mỗi một trong số 5 hàm băm là duy nhất vì việc băm lại, nhưng do thăm dò tuyến tính, nó thực sự có nhiều khả năng xảy ra các cấu trúc "nhóm" hơn ... nhưng vì chúng ta chỉ xem liệu một vị trí duy nhất có bị chiếm dụng hay không, điều này không không thực sự ảnh hưởng đến chúng tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.