简介
每一个C#程序员可能会使用的类??代码>的Hashtable??一个Hashtable是一种机制来存储和检索的键/值对。 Hashtable是有效率在很多方面,数据存储在RAM,使得它非常快速。如果键/值对的数目是非常大的?替代品是Windows注册表或关系数据库表。显然,人们可能不希望大量的应用程序数据存储在Windows注册表和数据库是饥饿和昂贵的资源。
HashFile类是试图找到问题的答案。HashFile类
HashFile是一种技术,插入/删除/在硬盘中的文件中找到键值对。它采用固定长度的记录存储数据和索引。有两个文件EM> name.dat和em> name.idx对应一个quot;??????namequot; "namequot;确定键/值对,并在初始化的时候。
"name.dat???
这是数据文件。数据文件存储键/值对固定长度的记录。应在初始化时指定的键/值对,密钥长度和价值的名称。数据文件的最大尺寸可以延伸到2 ^ 32字节,这是无符号整数的最大值(UINT32)。
?EM> name.idx???
这是索引文件。它存储固定长度的记录,记录指针和索引指针。记录指针和索引指针是无符号整数。索引技术
使用指数为91 × 2矩阵块(IB)来存储记录和索引指针。 Hashfile首次初始化时,将创建一个空的IB和每个元素将被填充的数据类型为uint的最大价值。为什么91行? 91中的字符的ASCII范围32-122。在IB的每一行代表一个ASCII字符。 IB的列记录指针和索引指针。列的数据类型是无符号整数。记录指针的起始字节数据记录的索引的起源,同样索引的指针起始字节索引记录的索引号的起源。
InsertKey方法的伪代码如下:以一个新的密钥字节如果字节范围内32-122的,然后跳左字节对应的距离内的IB匹配的索引记录,否则返回错误读取记录指针和索引指针如果索引指针等于最大值的数据类型为uint,然后,保存记录指针和索引指针,保存数据记录中的键和值,并返回记录指针否则记录指针读取数据记录比较新的密钥和现有关键
如果新的密钥相匹配现有的数据记录的关键,然后转到步骤10
如果新的关键是大于现有的关键,然后转到步骤11否则,第13步如果数据记录的状态,然后删除,保存新值,更改已删除标志设置为false,返回记录指针,否则返回错误如果索引指针指向未来的IB,采取下一步的字节,并跳转到第2步否则,创建新的IB,保存在新的IB的记录指针和索引指针,将启动新的IB指数的指针旧的IB,在数据记录保存键和值,返回记录指针如果索引指针指向下一个兴业,分配新的记录指针的索引记录,交换新的和现有的键跳转到第2步否则新的记录指针分配的索引记录,创造新的IB,分配现有的记录指针,新的索引指针,以新的IB,指定旧的IB开始新的IB指数指针,保存数据记录中的键和值,返回记录指针
听起来有点模糊,是不是?但该技术似乎在测试环境中工作。由于添加了新的密钥,索引机制,将尝试放置在尽可能从根兴业的最小距离记录指针。二进制树搜索算法消除了一半搜查后,每一个分支项目,而上面介绍的技术,无需担心的优秀记录90/91th可能后每IB假设人口分布。测试结果表明,平均IB读取找到约6.2记录,在528461键的人口,这听起来不错。详情请参阅测试结果部分。使用HashFile类
测试代码是hashfileTest.cs。一个方法测试HashFile.InsertKey{C}测试结果InsertKey
键= 528461,蜱= 1022397419386,频率= 299256万,平均写入时间(毫秒)= 0.646493162076644,平均读取= 5.77592859264922
键= 8125,蜱= 10044699390,频率= 299256万,平均写入时间(毫秒)= 0.413114755979444,平均读取= 5.50141538461538FindKey
键= 528461,蜱= 201771307445,频率= 299256万,平均读取时间(毫秒)= 0.127586169617676,平均读取= 6.14659738372368= 8125
键,滴答= 2945715784,频率= 299256万,平均读取时间(毫秒)= 0.121150331139174,平均读取= 5.48246153846154备注
释放类的版本只是一个原型,这显然意味着,该软件不应该在生产环境中使用。在这个版本的软件错误或错误引起的任何损失的最终用户的唯一责任。
任何建议,以改善HashFile类是最欢迎的。历史
2009年10月4日:初始版本