2012-05-22 29 views
5

Liệu nó có một số ý nghĩa đặc biệt khi hàm GetHashCode() trả về nội dung nào đó sử dụng mã số contains^symbol?GetHashCode() với^

public class ClassProp 
{ 
    public int Prop1 { get; set; } 
    public int Prop2 { get; set; } 
    public int Prop3 { get; set; } 
    public int Prop4 { get; set; } 
    public int Prop5 { get; set; } 

    public override int GetHashCode() 
    { 
     return Prop1.GetHashCode()^Prop2.GetHashCode()^
       Prop3.GetHashCode()^Prop4.GetHashCode()^Prop5.GetHashCode(); 
    } 
} 
+0

Nhiều câu trả lời cho rằng đó không phải là toán tử XOR. Nó được sử dụng ở đây chỉ để tạo ra một hashcode kết hợp. Hãy xem bài đăng này tại đây trên SO: http://stackoverflow.com/questions/1079192/is-it-possible-to-combine-hash-codes-for-private-members-to-generate-a-new- hash –

Trả lời

4

Đó chỉ là bitwise xor operator. Nó thường được sử dụng để kết hợp mã băm từ các đối tượng khác nhau vào một mã băm tổng thể duy nhất.

Đây không phải là một trong những điều dễ dàng nhất để tìm kiếm trên Google! Mẹo của tôi khi tìm kiếm những thứ như vậy là nhìn vào số table of all operators.

+0

bạn có thể chia sẻ một ví dụ thực sự đơn giản để hiểu khi nào sử dụng hàm GetHashCode() trong dự án thực tế đời sống? – Nilish

+0

Bạn thường không gọi chính mình là 'GetHashCode'. Nhưng khuôn khổ sử dụng nó để kiểm tra bình đẳng, băm từ điển, vv Chủ yếu là bạn có thể nhận được ngay với dựa vào việc thực hiện mặc định. –

+0

Bạn đang nói về điều này 'công khai ghi đè bool Equals (Object obj) {}'? Nếu vậy, mối quan hệ giữa hai cái này là gì? – Nilish

4

^ là C# XOR operator. Không có gì "đặc biệt" về nó, chỉ là các mã băm của tất cả các thuộc tính lớp là XOR'd với nhau.

Chỉnh sửa: GetHashCode trả về mã chung được sử dụng làm định danh viết tắt cho đối tượng phức tạp. Sử dụng phổ biến là trong các cấu trúc dữ liệu băm khi bạn muốn lưu trữ các đối tượng và sau đó nhanh chóng truy xuất chúng dựa trên mã băm của chúng. Giả sử một lớp Person và một số đối tượng với các mã băm tương ứng:

Alex 8540 
John 9435 
Peter 2453 

Các mã được tạo ra dựa trên một số hoặc tất cả các lĩnh vực của từng đối tượng và phải va chạm như hiếm khi càng tốt để đảm bảo hiệu quả băm. Bây giờ chúng ta có thể lưu trữ các đối tượng trong bảng băm bằng cách sử dụng mã băm:

Entries 
0 -> Alex 
1 -> John 
2 -> Peter 

Các đối tượng được lưu trữ trong bảng sử dụng mã băm tương ứng để xác định vị trí. Tiếp theo chúng có thể dễ dàng được lấy ra bằng cách sử dụng cùng một mã băm.

Tôi đề nghị bạn tìm một số tài liệu về cách thức các bảng băm hoạt động, bởi vì nó hơi quá nhiều để giải thích trong bài đăng SO.

+0

bạn có thể chia sẻ một ví dụ thực tế đơn giản để hiểu khi nào sử dụng hàm GetHashCode() trong dự án thực tế đời sống? – Nilish

+0

@Kanav: Xem chỉnh sửa của tôi. – Tudor

+0

Bạn có một bài viết rất cơ bản (một liên kết) trong từ điển của bạn? – Nilish

0

^ nếu các nhà điều hành XOR trong C# xem tại đây: http://msdn.microsoft.com/en-us/library/zkacc7k1.aspx

Tất cả các ví dụ của bạn đang làm được XORing hashcode từ đó là tài sản.

+0

bạn có thể chia sẻ một ví dụ thực sự đơn giản để hiểu khi nào sử dụng hàm GetHashCode() trong dự án thực tế đời sống? – Nilish

0

Nhà điều hành Bitwise XOR hoạt động như sau:

A = 10111 B = 01010

A^B = 11101

bit correspoding khác nhau resutl trong 1, những cái tương tự dẫn đến 0.

Trong trường hợp của bạn, các số nguyên này đang được chuyển đổi thành nhị phân trước và sau đó được xử lý như trong ví dụ trên.

2

Đó là bitwize XOR operator.

Đây là toán tử rất phổ biến được sử dụng khi triển khai GetHashCode.

Điều đó đang được nói, trong trường hợp này, việc triển khai đó có thể không lý tưởng. Vấn đề với việc sử dụng XOR (một mình) là bạn không nhất thiết phải giảm khả năng va chạm.Vấn đề là một lớp được xác định như vậy:

class Foo 
{ 
    public int Bar { get; set; } 
    public int Baz { get; set; } 

    // ... 
    public override int GetHashCode() 
    { return this.Bar.GetHashCode()^this.Baz.GetHashCode(); } 
} 

Sẽ tạo mã băm giống nhau khi Bar == 2 và Baz == 4 như khi Bar == 4 và Baz == 2. Tùy thuộc vào trường hợp sử dụng, điều này có thể dẫn đến nhiều xung đột băm hơn, do đó, đó là điều cần lưu ý khi triển khai GetHashCode. Ngoài ra - bạn nên rất cẩn thận khi bạn tạo một loại có thể thay đổi như thế này mà việc triển khai mã băm của bạn khớp với kiểm tra bình đẳng của bạn, v.v.

+1

bạn có thể chia sẻ một ví dụ thực tế đơn giản để hiểu khi nào sử dụng hàm GetHashCode() trong dự án thực tế đời sống? – Nilish

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