Sqlite中hash表解析

原创 2017年01月03日 22:07:11


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表本身的性能并没有明显的冲击,因此,这是一个十分实用的改进。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Sqlite3源代码学习之外篇—哈希表

多姿多彩的哈希表自从通过数据结构课程学习哈希表以来,对于哈希表的实现一直都是固定的课本上的理论,使用链表作为冲突消解策略,分配一个数组作为哈希表的基本结构,基本上实现哈希表的方法就是这样,但是一般因为...
  • missyou03
  • missyou03
  • 2010年06月16日 22:14
  • 3864

SQLite 基本操作--查看数据表信息

sqlite>.tables --查看当前数据库所有表 sqlite>.tables table_name --查看当前数据库指定表 sqlite>.schema --查看当前数据库所有表的建表...
  • navioo
  • navioo
  • 2016年05月13日 18:31
  • 7541

创建SQLite数据库和新建一张表格

一、步骤 1.新建MyDatabaseHelper类继承自SQLiteOpenHelper; 重写构造函数MyDatabaseHelper(Context context, String name,C...
  • ningchao328
  • ningchao328
  • 2016年11月10日 16:33
  • 5946

SQLite创建多个表

package com.yangguangfu.database;    import android.content.Context;  import android.database.sqlite...
  • freemindhack
  • freemindhack
  • 2014年09月10日 22:21
  • 1320

sqlite查看所有表名及字段名,及判断是否存在的方法

sqlite查看所有表名及字段名,及判断是否存在的方法
  • aflyeaglenku
  • aflyeaglenku
  • 2016年03月14日 11:27
  • 12741

android 中关于Sqlite 表的创建 修改 删除

正好我要用 原文地址:创建、修改、删除表" style="text-decoration:none; color:rgb(99,64,27)">SQLite 创建、修改、删除表作者:醋根 一、...
  • shangxinlei88
  • shangxinlei88
  • 2014年10月31日 14:01
  • 1174

Android SQLite 动态新增表

上篇文章介绍了SQLite的建表方法,但是在项目中会遇到这样的问题。表结构不是一次就能定义得完整,随着项目的发展,需求的变更,数据库中的表项也可能随着增加或者发生改变。 如果从新定义表结构,对导致应...
  • coycleipenghui
  • coycleipenghui
  • 2016年09月11日 00:02
  • 1846

sqlite优化之多表查询

今天在优化公司项目中,发现一个列表在离线加载时速度非常慢,加载1000条数据,竟然需要13s!!!跟了一下db层代码@Override public ArrayList loadMineTas...
  • byszy
  • byszy
  • 2015年12月31日 18:01
  • 4152

sqlite 修改表名,合并数据库(文件)

修改表名: ALTER TABLE orig_table_name RENAME TO tmp_table_name; 合并2个数据库的表: 1、先连接数据库A 2、再attach数据库B作为第二数...
  • langyuejing
  • langyuejing
  • 2015年03月26日 17:50
  • 1836

sqlite数据库解析

sqlite以高速的select性能,超小的体积,安全性,跨平台型深深的吸引了我,但是我不得不为其没有存储过程,函数而泪奔。 下面列出安装需要的文件 DxSqliteManagement2...
  • a5251199
  • a5251199
  • 2015年11月12日 10:48
  • 560
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Sqlite中hash表解析
举报原因:
原因补充:

(最多只允许输入30个字)