Giới thiệu
Phương thức Single.GetHashCode() trong C# trả về mã băm (hash code) cho thể hiện float hiện tại. Mã băm dùng cho các cấu trúc dữ liệu dựa trên băm như HashSet, Dictionary, Hashtable.
Cú pháp
public override int GetHashCode ();
Ví dụ 1: So sánh hash code của hai float khác nhau
using System;
public class Demo {
public static void Main() {
float f1 = 40.2f;
object f2 = 50.5f; // Boxing
Console.WriteLine("Value1 = " + f1);
Console.WriteLine("HashCode của Value1 = " + f1.GetHashCode());
Console.WriteLine("Value2 = " + f2);
Console.WriteLine("HashCode của Value2 = " + f2.GetHashCode());
Console.WriteLine("Hai giá trị có bằng nhau? = " + f1.Equals(f2));
}
}
Đầu ra ví dụ 1
Value1 = 40.2 HashCode của Value1 = 1109445837 Value2 = 50.5 HashCode của Value2 = 1112145920 Hai giá trị có bằng nhau? = False
Ví dụ 2: Hash code và CompareTo
using System;
public class Demo {
public static void Main() {
float f1 = 15.3f;
float f2 = 35.9f;
Console.WriteLine("Value1 = " + f1);
Console.WriteLine("Hashcode cho Value1 = " + f1.GetHashCode());
Console.WriteLine("Value2 = " + f2);
Console.WriteLine("Hashcode cho Value2 = " + f2.GetHashCode());
Console.WriteLine("Kết quả so sánh f1 và f2 = " + f1.CompareTo(f2));
}
}
Đầu ra ví dụ 2
Value1 = 15.3 Hashcode cho Value1 = 1098173645 Value2 = 35.9 Hashcode cho Value2 = 1108318618 Kết quả so sánh f1 và f2 = -1
Đặc điểm quan trọng
- Hai giá trị float bằng nhau (theo
Equals) luôn có cùng hash code. - Hai giá trị khác nhau có thể có cùng hash code (collision), tuy nhiên xác suất thấp.
- Giá trị đặc biệt:
float.NaNluôn trả về hash code cố định.float.PositiveInfinityvàfloat.NegativeInfinitycó hash code riêng.0.0fvà-0.0fbằng nhau theo Equals nhưng có hash code khác nhau (theo chuẩn IEEE 754).
- Hash code không đảm bảo duy nhất, không dùng để định danh đối tượng.
Lưu ý về boxing
Khi gán float cho object (boxing), GetHashCode() vẫn hoạt động chính xác vì nó được override trong struct Single.
Ứng dụng thực tế
- Làm key trong
Dictionary<float, T>hoặcHashSet<float>. - Kiểm tra sự thay đổi giá trị nhanh chóng (so sánh hash code trước, rồi Equals).
- Phân phối dữ liệu trong thuật toán phân tán, consistent hashing.