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

Lấy mã băm (hash code) của instance Decimal hiện tại trong C#

Giới thiệu

Phương thức GetHashCode() của Decimal trả về mã băm 32-bit (int) đại diện cho giá trị. Được sử dụng trong Hashtable, Dictionary, HashSet để so sánh nhanh.

Ví dụ 1: Hash code của giá trị Decimal cụ thể

using System;

public class Demo
{
    public static void Main()
    {
        Decimal val = 135269.38193M;
        Console.WriteLine("Decimal Value = {0}", val);
        Console.WriteLine("HashCode = {0}", (val.GetHashCode()));
    }
}

Kết quả

Decimal Value = 135269.38193
HashCode = 1328665595

Ví dụ 2: Hash code của Decimal.MaxValue

using System;

public class Demo
{
    public static void Main()
    {
        Decimal val = Decimal.MaxValue;
        Console.WriteLine("Decimal Value = {0}", val);
        Console.WriteLine("HashCode = {0}", (val.GetHashCode()));
    }
}

Kết quả

Decimal Value = 79228162514264337593543950335
HashCode = 1173356544

Đặc điểm HashCode của Decimal

  • Cùng giá trị → cùng HashCode (trong cùng phiên bản runtime)
  • Khác giá trị → có thể cùng HashCode (va chạm - collision)
  • Decimal so sánh giá trị (value equality), không phải tham chiếu
  • 12.0m và 12.00m có HashCode khác nhau (khác scale)

Ví dụ va chạm HashCode

Decimal d1 = 1.0m;
Decimal d2 = 1.00m;
Console.WriteLine(d1 == d2);        // True (giá trị bằng nhau)
Console.WriteLine(d1.GetHashCode() == d2.GetHashCode()); // False (scale khác)

Lưu ý khi dùng trong Dictionary/HashSet

  • Decimal phù hợp làm khóa nhờ so sánh giá trị
  • Nhưng 1.0m và 1.00m là khóa khác nhau trong Dictionary
  • Cân nhắc chuẩn hóa (normalize) Decimal trước khi dùng làm khóa