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.Createtự suy luận kiểu generic.