Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Lấy HashCode của Tuple trong C#

Mục đích

Phương thức Tuple.GetHashCode() trả về mã băm (int) cho tuple. Hai tuple **bằng nhau** (các Item tương ứng Equals) **phải** có cùng HashCode. Dùng cho Dictionary, HashSet key.

Ví dụ 1: Tuple 8 phần tử (có nested Tuple)

using System;

public class Demo
{
    public static void Main(string[] args)
    {
        // Tuple 8 phần tử: Tuple với TRest = Tuple
        var tuple1 = Tuple.Create(150, 400, 500, 700, 100, 1200, 1500, Tuple.Create(50, 100));
        var tuple2 = Tuple.Create(150, 400, 500, 700, 100, 1200, 1500, Tuple.Create(100, 200));

        Console.WriteLine($"Tuple1 == Tuple2? {tuple1.Equals(tuple2)}"); // False
        Console.WriteLine($"HashCode Tuple1: {tuple1.GetHashCode()}");   // 4621968
        Console.WriteLine($"HashCode Tuple2: {tuple2.GetHashCode()}");   // 4623530
    }
}

Kết quả

Tuple1 == Tuple2? False
HashCode Tuple1: 4621968
HashCode Tuple2: 4623530

Ví dụ 2: Tuple 7 phần tử giống hệt nhau

using System;

public class Demo
{
    public static void Main(string[] args)
    {
        var tuple1 = Tuple.Create(75, 200, 500, 700, 100, 1200, 1500);
        var tuple2 = Tuple.Create(75, 200, 500, 700, 100, 1200, 1500);

        Console.WriteLine($"Tuple1 == Tuple2? {tuple1.Equals(tuple2)}"); // True
        Console.WriteLine($"HashCode Tuple1: {tuple1.GetHashCode()}");   // 3231587
        Console.WriteLine($"HashCode Tuple2: {tuple2.GetHashCode()}");   // 3231587
    }
}

Kết quả

Tuple1 == Tuple2? True
HashCode Tuple1: 3231587
HashCode Tuple2: 3231587

Cơ chế HashCode của Tuple

  • Kết hợp hash code của các Item bằng thuật toán pha trộn (combine hash).
  • Tuân thủ quy tắc: a.Equals(b) == true => a.GetHashCode() == b.GetHashCode().
  • Ngược lại không bắt buộc (hash collision có thể xảy ra).

ValueTuple (C# 7+) - HashCode khác

var vt1 = (1, 2, 3);
var vt2 = (1, 2, 3);
Console.WriteLine(vt1.GetHashCode() == vt2.GetHashCode()); // True
// ValueTuple dùng EqualityComparer.Default cho từng field.

Sử dụng Tuple làm Key trong Dictionary

var dict = new Dictionary, string>
{
    [Tuple.Create(1, "A")] = "Value 1",
    [Tuple.Create(2, "B")] = "Value 2"
};

// Tra cứu
string val = dict[Tuple.Create(1, "A")]; // "Value 1"

Lưu ý

  • Tuple là **reference type** (class) -> heap allocation, GC pressure.
  • Immutable: an toàn cho key.
  • Code mới: **dùng ValueTuple (struct)** hiệu năng tốt hơn, syntax đẹp hơn.
  • Tuple.Create tự suy luận kiểu generic.