Giới thiệu
Mọi đối tượng trong .NET đều có phương thức GetHashCode() trả về mã băm (hash code) dạng int. Đối với chuỗi (string), mã băm được tính dựa trên nội dung chuỗi. Hai chuỗi giống nội dung sẽ cho cùng mã băm (trong cùng một phiên chạy ứng dụng).
Ví dụ 1: Hai chuỗi khác nhau
using System;
public class Demo
{
public static void Main(string[] args)
{
string str1 = "Akon";
string str2 = "Eminem";
Console.WriteLine("Chuỗi 1 = " + str1);
Console.WriteLine("HashCode của chuỗi 1 = " + str1.GetHashCode());
Console.WriteLine("Chuỗi 2 = " + str2);
Console.WriteLine("HashCode của chuỗi 2 = " + str2.GetHashCode());
Console.WriteLine("Chuỗi 1 bằng chuỗi 2: {0}", str1.Equals(str2));
}
}
Kết quả
Chuỗi 1 = Akon
HashCode của chuỗi 1 = 416613838
Chuỗi 2 = Eminem
HashCode của chuỗi 2 = 40371907
Chuỗi 1 bằng chuỗi 2: False
Ví dụ 2: Hai chuỗi giống nhau
using System;
public class Demo
{
public static void Main(string[] args)
{
string str1 = "Imagine Dragons";
string str2 = "Imagine Dragons";
Console.WriteLine("Chuỗi 1 = " + str1);
Console.WriteLine("HashCode của chuỗi 1 = " + str1.GetHashCode());
Console.WriteLine("Chuỗi 2 = " + str2);
Console.WriteLine("HashCode của chuỗi 2 = " + str2.GetHashCode());
Console.WriteLine("Chuỗi 1 bằng chuỗi 2: {0}", str1.Equals(str2));
}
}
Kết quả
Chuỗi 1 = Imagine Dragons
HashCode của chuỗi 1 = -1546868095
Chuỗi 2 = Imagine Dragons
HashCode của chuỗi 2 = -1546868095
Chuỗi 1 bằng chuỗi 2: True
Lưu ý quan trọng
- Mã băm có thể khác nhau giữa các phiên bản .NET, giữa 32-bit và 64-bit, hoặc giữa các lần chạy ứng dụng (từ .NET Core 2.0+ mặc định bật randomized hashing).
- Không nên lưu trữ hash code vĩnh viễn (lưu vào database, file) vì có thể thay đổi.
- Để so sánh chuỗi, hãy dùng
Equalshoặc toán tử==, không nên so sánh hash code.