2012-06-18 33 views
6

Tôi muốn biết rằng Clojure sử dụng băm 32 bit để thực hiện bản đồ, nếu bản đồ Clojure do đó có giới hạn 2^32-1 khóa (và nếu điều này không đúng, cách nó quản lý va chạm) và nếu việc triển khai băm của nó là consistent. TIA!Giới hạn bản đồ Clojure và tính nhất quán

+0

Các bạn đã nhìn vào mã nguồn? – pmdj

+0

Vâng, nhưng tôi không thể hiểu đầy đủ vì tôi không phải là nhà phát triển Java: từ những gì tôi đã hiểu hàm băm là hasheq đại biểu cho Integer trong trường hợp cụ thể mà khóa là một phương thức Integer và key hasheq Object. Nhưng tôi không thể hiểu (hoặc ngược lại dấu vết) hàm băm được sử dụng, nếu các va chạm hỗ trợ bản đồ và nếu hàm băm là nhất quán! –

+0

(Tôi sẽ không bao giờ hiểu một số downvotes) –

Trả lời

10

bản đồ Clojure là một thực hiện tùy chỉnh mà là dai dẳng và bất biến (ví dụ: nó không hashmaps sử dụng Java, điều này sẽ không cung cấp đủ hiệu suất khi sử dụng trong một cấu trúc dữ liệu không thay đổi).

Nó sử dụng mã băm 32 bit, do đó 2^32 nhóm băm có thể. Trong trường hợp va chạm, khóa và giá trị được lưu trữ trong một mảng cho mỗi nhóm băm sao cho nó là có thể có nhiều hơn 2^32 khóa. Xem PersistentHashMap source - đặc biệt lớp bên trong HashCollisionNode được sử dụng để lưu trữ một nhóm khóa/giá trị dựa vào một giá trị hashcode duy nhất.

Vì số lượng nhóm băm có thể cố định, băm nhất quán không liên quan - khóa không bao giờ cần phải được ánh xạ lại.

Xem thêm:

+0

Cảm ơn bạn rất nhiều! –

Các vấn đề liên quan