WEB开发网
开发学院软件开发C语言 C# 用哈希表搜索对象 阅读

C# 用哈希表搜索对象

 2009-03-09 08:19:57 来源:WEB开发网   
核心提示: 在本篇文章中,我将详述我在前面的文章(“为更好的集合创建类”)中的样例,C# 用哈希表搜索对象(2),让你修改一条员工记录,假设有一个很大的公司,你可以下载样例,看看运用hash keys进行搜索和运用序列式容器进行搜索有什么不同,公司里有上千位员工,你想用最快的方

在本篇文章中,我将详述我在前面的文章(“为更好的集合创建类”)中的样例,让你修改一条员工记录。假设有一个很大的公司,公司里有上千位员工,你想用最快的方法来找到一条记录。所有员工的一个哈希表可以使搜索在最短的时间完成。

一个哈希函数需要有一定的属性。对于初学者来说,哈希函数必须是不变的。这就是说相同的key必须生成相同的hash value,一旦创建了对象,hash value就不能改变了。如果hash value改变了,你在哈希表中就再也找不到相应的对象了。

哈希函数需要的第二个属性就是能够平均分配buckets。如果所有的对象都生成相同的hash value,那么就需要更多的时间来查找一个特殊的对象。

实际上,这两个原则是很容易遵循的。在.NET Framework中有178个类重载了GetHashCode(),从而更好地发挥它们的作用。所有的.NET FCL(Framework Class Library)中类的实现都确保了hash value的更好的分配,并遵循了唯一性的原则。你应该确定你自己的类和结构是否需要重载GetHashCode()方法。最简单的(通常也是最好的)方法就是在key中选取一个不变的成员,并运用那个成员所生成的hash value。

员工数据库的一个明显的hash key就是社会保险号(Social Security Number)。它不仅不会改变,而且九位数的这个号码也可以让你任意运用以得到你期望的性能。你可以下载样例,看看运用hash keys进行搜索和运用序列式容器进行搜索有什么不同。

要把员工添加到一个哈希表中,你可以创建一个九位数的号码并把它作为key:

int hash = 111223333;
for (int i = 0; i < 100; i++)
{
  string lastname = "Person" + i.ToString();
  e = new Employee ("Employee", lastname, (200-i)*200);
  members.Add(hash++, e);
}

Tags:哈希 搜索 对象

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接