首先,C#中的GetHashCode()方法是一个用于获取对象哈希码的函数,用于将对象的状态转换为一串数字,以便在哈希表等数据结构中进行高效查找。它返回一个int类型的哈希值,可以作为该对象在哈希表中的索引值。
GetHashCode()的实现方式可能因为不同的开发者或.NET Framework版本而有所不同,但常见的默认实现是通过将对象中的字段或属性(称为哈希码“种子”)组合在一起,然后进行位运算或运算符等操作得到哈希值。
下面是GetHashCode()的使用示例:
示例一
class Student
{
public string Name { get; set; }
public int Age { get; set; }
public override int GetHashCode()
{
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + Age.GetHashCode();
return hash;
}
}
class Program
{
static void Main(string[] args)
{
var s1 = new Student() { Name = "Tom", Age = 18 };
var s2 = new Student() { Name = "Tom", Age = 18 };
Console.WriteLine(s1.GetHashCode() == s2.GetHashCode()); // true
}
}
在这个示例中,我们重写了Student类的GetHashCode()方法,使用了Name和Age属性的哈希码来作为这个类型对象的哈希码。由于s1和s2的Name和Age属性值完全相同,因此它们的哈希码相同。
示例二
struct Vector
{
public float X { get; set; }
public float Y { get; set; }
public override int GetHashCode()
{
int bitsX = BitConverter.ToInt32(BitConverter.GetBytes(X), 0);
int bitsY = BitConverter.ToInt32(BitConverter.GetBytes(Y), 0);
return bitsX ^ bitsY;
}
}
class Program
{
static void Main(string[] args)
{
var v1 = new Vector() { X = 1.0f, Y = 2.0f };
var v2 = new Vector() { X = 1.0f, Y = 2.0f };
Console.WriteLine(v1.GetHashCode() == v2.GetHashCode()); // true
}
}
在这个示例中,我们创建了一个结构体Vector来表示二维向量,重写了GetHashCode()方法,将X和Y属性的位表示组合在一起作为哈希值。使用BitConverter的方法将float类型转换成int类型,这种转换的实现方式可能因系统不同而有所不同。使用“^”操作符将两个int类型数据进行异或运算,生成最终的哈希码。
这两个示例说明了GetHashCode()方法的不同用法和实现方式。通过合理的实现哈希码,可以在哈希表和字典中提高查找效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# GetHashcode():返回当前实例的哈希代码 - Python技术站