哈希表的原理精讲
哈希表 - 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法
键(key) | 组员的编号 |
---|---|
值(value) | 组员的其它信息 |
索引 | 数组的下标(0,1,2,3,4) ,用以快速定位和检索数据 |
哈希桶 | 保存索引的数组(链表或数组),数组成员为每一个索引值相同的多个元素 |
哈希函数 | 将组员编号映射到索引上,采用求余法 |
原理示意图:
哈希表结构体定义
#define DEFAULT_SIZE 16
typedef struct _ListNode
{
struct _ListNode *next;
int key; void *data;
}ListNode;
typedef ListNode *List;
typedef ListNode *Element;
typedef struct _HashTable
{
int TableSize;
List *Thelists;
}HashTable;
企业级应用
根据淘宝数据分析,有上十亿的商品。每一个商品有包括大量的图片和文字需要大量块磁盘来保存.
1PB = 1024 TB = 1024 * 1024 GB
淘宝针对海量非结构化数据存储设计出了的一款分布式系统,叫TFS,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问。
文件接口
文件系统 -一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问。
储存基本单位
扇区 - 硬盘的最小存储存储单位(Sector)。一般每个扇区储存512字节(相当于0.5KB)
- 磁盘的每一面被分为很多条磁道,即表面上的一些同心圆,越接近中心,圆就越小。
- 而每一个磁道又按512个字节为单位划分为等分,叫做扇区.
文件存储单位
块 - 文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件结构
操作系统自动将硬盘分成三个区域。
- 目录项区 - 存放目录下文件的列表信息
- 数据区 - 存放文件数据
- inode区(inode table) - 存放inode所包含的信息
关于Inode
- inode - “索引节点”,储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
- inode节点大小 - 一般是128字节或256字节。inode节点的总数,格式化时就给定,一般是每1KB或每2KB就设置一个inode。一块1GB的硬盘中,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。