2011-07-26 48 views
9

Tôi có một lớp bất biến chỉ có trường là bool[] (kích thước được xác định khi chạy).GetHashCode() từ booleans chỉ

Làm cách nào tôi có thể tính toán mã băm tốt của lớp này? Nói chung, tôi chỉ gọi GetHashCode() trên mỗi trường và kết hợp chúng với một trong số các toán tử sau: + | &, nhưng vì mã băm duy nhất có thể là 0 cho false1 cho true, điều đó thực sự không đưa tôi đến bất kỳ đâu. Việc triển khai của tôi chỉ cần làm việc với chỉ bools và phải hoạt động với một mảng có kích thước tùy ý.

(Có lẽ không quan trọng nhiều, nhưng tôi mã hóa trong C#/NET..)

+0

bạn đã xem 'BitArray' hay tùy thuộc vào kích thước 'BitVector32'? Điều đó sẽ yêu cầu thực hiện ít hơn như 'GetHashCode' và tương tự. – Sebastian

Trả lời

8

Giả sử bạn bool[] được đặt tên bools:

unchecked { 
    int hash = 17; 
    for(int index = 0; index < bools.Length; index++) { 
     hash = hash * 23 + bools[index].GetHashCode(); 
    } 
    return hash; 
} 
+1

Bạn có thể giải thích các con số không Jason? 17 và 23 xuất phát từ đâu? :-) –

+0

@Jamie Dixon: Đây là loại triển khai chuẩn; điểm mấu chốt là số nhân là số nguyên tố. Tôi nghĩ rằng 'String.getHashCode' của Java là một cái gì đó rất giống nhau. – jason

+0

điều này sẽ không hoạt động, các mảng có cùng các phần tử ở các vị trí khác nhau sẽ cung cấp cùng một mã băm – mcabral

0

Simple bools.GetHashCode() hoạt động tốt cho đến khi bạn đang quan tâm về hiệu suất (trong trường hợp này sử dụng giải pháp của Jason).

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