宋城虎,马 静
(中国电子科技集团公司第二十七研究所,河南 郑州450047)
HashTable(也叫哈希表),是根据关键码值(key,value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。在.NET Framework中,System.Collections命名空间提供了HashTable容器的实现。HashTable中key、value键值对均为object类型,所以HashTable可以支持任何类型的key、value键值对。
在工程应用中,上位机应用程序通常需要与多个下位机或者外围设备进行通信,从而实现对设备的控制以及设备状态与数据的接收与处理。当上位机通信的对象增多时,上位机编程也会随之变得越来越复杂。
本文以C#WinForm框架下的上位机编程为例讨论一种HashTable的应用方法,该方法实现简单,使用灵活方便,可大幅度简化上位机程序开发中的一些复杂问题。
HashTable的结构为1个key对应1个value,这个结构在实际应用中经常显得过于单一,如果两个key对应1个value那么显然就会灵活许多,我们就可以构建类似于“对象‘key1’的‘key2’属性为‘value’”这样的逻辑关系(如图1、图2所示)。
由于在.NET Framework中的HashTable中key、value键值对均为object类型,那么value本身也可以存储另一个HashTable,因此我们可以构建两层哈希表来实现双键哈希结构,即在第一层HashTable1中通过key1存储第二层HashTable2,在第二层HashTable2中通过key2存储value值(如图3所示)。
于是我们只需要定义哈希表的三个基本操作“存储、读取、删除”即可实现双键哈希表功能。其中删除需要针对key1和key2定义两个函数,因此总共需要定义4个函数,以下给出代码:
void hash_save(Hashtable hash,object key1,object key2,object value)
{
if(hash!=null)
{
Hashtable hash1;
if(hash[key1]==null)
{
hash1=new Hashtable();
hash.Add(key1,hash1);
}
else hash1=(Hashtable)(hash[key1]);
if(hash1[key2]==null)hash1.Add(key2,value);
else{
hash1.Remove(key2);
hash1.Add(key2,value);
}}}
object hash_Load(Hashtable hash,object key1,object key2)
{
i(fhash[key1]!=null)return((Hashtable)(hash[key1]))[key2];
else return null;
}
void hash_remove_key1(Hashtable hash,object key1)
{
((Hashtable)(hash[key1])).Clea(r);
}
void hash_remove_key2(Hashtable hash,object key1,object key2)
{
((Hashtable)(hash[key1])).Remove(key2);
}
上位机应用程序通常需要与多个下位机或者外围设备进行通信,这里以udp通信为例(其他通信原理相同)。……