เมธอด 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 เฉพาะ