Phương thức Double.GetHashCode() trong C# được dùng để trả về mã băm (hash code) cho instance double này. Hash code được dùng trong các cấu trúc dữ liệu dựa trên băm như Dictionary, HashSet, Hashtable.
Cú pháp
public override int GetHashCode();
Ví dụ 1: GetHashCode với double và object
using System;
public class Demo
{
public static void Main()
{
double d1 = 150d;
object ob1 = 1 / 2; // Integer division = 0 (int), boxed to object
Console.WriteLine("Double1 Giá trị = " + d1);
Console.WriteLine("Object Giá trị = " + ob1);
Console.WriteLine("Hai giá trị bằng nhau? = " + d1.Equals(ob1));
Console.WriteLine("Mã băm của Double1 = {0}", d1.GetHashCode());
}
}
Kết quả
Double1 Giá trị = 150 Object Giá trị = 0 Hai giá trị bằng nhau? = False Mã băm của Double1 = 1080213504
Ví dụ 2: GetHashCode đơn giản
using System;
public class Demo
{
public static void Main()
{
double d = 10d;
Console.WriteLine("Double Giá trị = " + d);
Console.WriteLine("Mã băm của Double = {0}", d.GetHashCode());
}
}
Kết quả
Double Giá trị = 10 Mã băm của Double = 1076101120
Đặc điểm của GetHashCode cho Double
- Hai giá trị double bằng nhau (theo
Equals) sẽ có cùng hash code. - Ngược lại không đảm bảo**: hash code trùng không nghĩa là giá trị bằng (collision).
NaN: Tất cả các giá trị NaN trả về cùng một hash code (đặc biệt).+0.0và-0.0: Bằng nhau theo Equals, nhưng hash code khác nhau (theo IEEE 754).+Infinityvà-Infinity: Hash code khác nhau.
Ví dụ đặc biệt: NaN, +0/-0, Infinity
double nan1 = double.NaN;
double nan2 = 0.0 / 0.0;
double posZero = +0.0;
double negZero = -0.0;
double posInf = 1.0 / 0.0;
double negInf = -1.0 / 0.0;
Console.WriteLine("NaN1 HashCode: " + nan1.GetHashCode());
Console.WriteLine("NaN2 HashCode: " + nan2.GetHashCode()); // Cùng hash code
Console.WriteLine("NaN1 == NaN2? " + nan1.Equals(nan2)); // False (NaN != NaN)
Console.WriteLine("+0.0 HashCode: " + posZero.GetHashCode());
Console.WriteLine("-0.0 HashCode: " + negZero.GetHashCode()); // Khác nhau!
Console.WriteLine("+0.0 == -0.0? " + posZero.Equals(negZero)); // True
Console.WriteLine("+Inf HashCode: " + posInf.GetHashCode());
Console.WriteLine("-Inf HashCode: " + negInf.GetHashCode());
Kết quả mẫu
NaN1 HashCode: -524288 NaN2 HashCode: -524288 NaN1 == NaN2? False +0.0 HashCode: 0 -0.0 HashCode: -2147483648 +0.0 == -0.0? True +Inf HashCode: 2146435072 -Inf HashCode: -1048576
Lưu ý khi dùng trong Dictionary/HashSet
- Double làm key trong Dictionary: hoạt động bình thường nhờ Equals/GetHashCode nhất quán (trừ NaN/+0/-0).
- Tránh dùng NaN làm key (Equals trả về false cho NaN, gây rò rỉ bộ nhớ logic).
- Cân nhắc làm tròn hoặc dùng decimal cho tiền tệ/so sánh chính xác.