Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

เมธอด Double.GetHashCode() ใน C# : ดึงรหัสแฮชของค่า Double

เมธอด Double.GetHashCode() ใน C# ใช้คืนค่ารหัสแฮช (hash code) ของ instance Double นี้ ใช้สำหรับอัลกอริทึมแฮชและโครงสร้างข้อมูลเช่น HashTable, Dictionary

รูปแบบไวยากรณ์ (Syntax)

public override int GetHashCode();

ตัวอย่างที่ 1: HashCode ของค่าปกติและเปรียบเทียบกับ Object

using System;

public class Demo
{
    public static void Main()
    {
        double d1 = 150d;
        object ob1 = 1 / 2; // integer division = 0 (int), แล้ว box เป็น object
        
        Console.WriteLine("Double1 Value = " + d1);
        Console.WriteLine("Object Value = " + ob1);
        Console.WriteLine("Are both values equal? = " + d1.Equals(ob1)); // False (double vs int)
        Console.WriteLine("HashCode of Double1 Value = {0}", d1.GetHashCode());
    }
}

ผลลัพธ์

Double1 Value = 150
Object Value = 0
Are both values equal? = False
HashCode of Double1 Value = 1080213504

ตัวอย่างที่ 2: HashCode ของค่าต่างๆ

using System;

public class Demo
{
    public static void Main()
    {
        double d = 10d;
        
        Console.WriteLine("Double Value = " + d);
        Console.WriteLine("HashCode of Double Value = {0}", d.GetHashCode());
    }
}

ผลลัพธ์

Double Value = 10
HashCode of Double Value = 1076101120

ข้อสังเกตสำคัญเกี่ยวกับ Double.GetHashCode()

  • ค่าที่เท่ากัน (Equals = true) จะมี HashCode เท่ากันเสมอ (แต่กลับกันไม่จำเป็น)
  • NaN มี HashCode คงที่เฉพาะตัว (แต่ NaN != NaN ตาม IEEE 754)
  • PositiveInfinity และ NegativeInfinity มี HashCode คงที่เฉพาะตัว
  • HashCode อาจต่างกันระหว่างรุ่น .NET หรือแพลตฟอร์م (ไม่ควร persist ไว้ใช้ข้าม session)
  • สำหรับ double ที่เป็นจำนวนเต็มเล็ก HashCode มักจะเกี่ยวข้องกับค่าตัวเลข แต่ไม่รับประกัน

ตัวอย่างพิเศษ: ค่าพิเศษ

Console.WriteLine("NaN HashCode: " + double.NaN.GetHashCode());
Console.WriteLine("+Infinity HashCode: " + double.PositiveInfinity.GetHashCode());
Console.WriteLine("-Infinity HashCode: " + double.NegativeInfinity.GetHashCode());
Console.WriteLine("0.0 HashCode: " + (0.0).GetHashCode());
Console.WriteLine("-0.0 HashCode: " + (-0.0).GetHashCode()); // เท่ากับ 0.0

สรุป

  • GetHashCode() ใช้ภายใน Dictionary/HashSet เพื่อจัดเก็บและค้นหา
  • ไม่ควรนำ HashCode ไปใช้เป็น unique identifier หรือเก็บไว้ long-term
  • Double.Equals() จัดการ NaN, Infinity, -0.0 อย่างถูกต้องตาม IEEE 754
  • Override ได้ใน custom struct หากต้องการ hash behavior เฉพาะ