Sqlite中hash表解析


Hash表,是一个十分常见的存储结构,是字典存储的主要实现方式。相比链表,hash表的搜索性能十分优越,理论上可以达到O(1)的时间复杂度。所以hash表基本是超大型的字典的唯一选择吗,不过hash表也存在内存占用较大的缺点,即便表中一个有效数据都没有,都要占用一个不小的初始空间。

 

Sqlite是一个轻量级数据库,能够运行在大部分的嵌入式操作系统上。作为一个关系型数据库,其存储结构是一张张的表,内存组织形式是划分为一个个的pagepage是通过B树来组织的。不过sqlite中同样也用到了hash table,由官网文档的描述是parser使用的symbol tables便是hash table实现的。

文本框: ** Hash.htsize and Hash.ht may be zero.  In that case lookup is done ** by a linear search of the global list.  For small tables, the  ** Hash.ht table is never allocated because if there are few elements ** in the table, it is faster to do a linear search than to manage ** the hash table. */ struct Hash {   unsigned int htsize;      /* Number of buckets in the hash table */   unsigned int count;       /* Number of entries in this table */   HashElem *first;          /* The first element of the array */   struct _ht {              /* the hash table */     int count;                 /* Number of entries with this hash */     HashElem *chain;           /* Pointer to first entry with this hash */   } *ht; };   /* Each element in the hash table is an instance of the following  ** structure.  All elements are stored on a single doubly-linked list. ** ** Again, this structure is intended to be opaque, but it can't really ** be opaque because it is used by macros. */ struct HashElem {   HashElem *next, *prev;       /* Next and previous elements in the table */   void *data;                  /* Data associated with this element */   const char *pKey; int nKey;  /* Key associated with this element */ };
在阅读sqlite源码hash部分的时候,发现其实现比较有趣,主要是sqlite用单个数据结果能够同时表现为hash表和链表,能够在数据量大的时候发挥hash表效率高的优点,而在数据量低的时候发挥链表节约空间的优点。

其结构体定义如上述代码所示,和普通的hash表比较,基本只是多了一个first指针。

其结构如下图所示,同样可以看到,其包含了一个常规的hash table,此外,还有一个hash表元素的指针firstHash表元素入表时,除了加入到bucket中,还会组织成为一个链表。此hash表应对冲突的方式同样是使用链表。在ht结构体,即bucket数组的每个元素中除了链表chain以外,还包含了一个count,是因为所有buckets的元素都组织成为一张链表,只有通过记录每个bucket的元素的个数才能分割各个bucket

 

除了上述可以在hash表和普通链表中灵活变换以外,其还有一个十分不错的优点,就是可以快速的遍历hash表中所有的元素,而在普通的hash表中,遍历元素则没有那么简单。另一方面,此hash表进行了相应改进获得了灵活性和遍历性能提升的同时,对hash表本身的性能并没有明显的冲击,因此,这是一个十分实用的改进。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bysu_/article/details/53998776
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Sqlite中hash表解析

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭