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

Phương thức Double.GetHashCode() trong C#

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.0 và -0.0: Bằng nhau theo Equals, nhưng hash code khác nhau (theo IEEE 754).
  • +Infinity và -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.