注意
文章详解(http://blog.csdn.net/v_july_v/article/details/6256463)
哈希由来:
- 数组的特点是:寻址容易,插入和删除困难
- 链表的特点是:寻址困难,插入和删除容易
做出一种寻址容易,插入删除也容易
哈希特点:
- 通过散列算法,变换成固定长度的输出;
- 散列值的空间通常远小于输入的空间, 不同的输入可能会散列成相同的输出,
而不可能从散列值来唯一的确定输入值 - 一种将任意长度的消息压缩到某一固定长度的消息摘要的函数 HASH主要用于
- 信息安全领域中加密算法,一些不同长度的信息转化成杂乱的128位的编码,HASH值
哈希表长度该定义多大:
一般采用哈希算法的时候,哈希表的长度设为多大?有什么依据?
- 越长碰撞越少,但耗得资源也就多了
- 最大的出发点就是没有冲突
- 哈希就是散列,散列就是把关键字分布均匀撒到到每一个桶内,哈希表越长,散列函数越好,自然查找效率就越高.
哈希表长度定义举例说明:
比如说要处理的数据集合有100,000个,每一项的数据占用内存约为50bytes,我的哈希表的长度在多大比较合适?
- hash表里面存指针,表长整成数据集合的10倍,100000*4*10 也就是4MB内存
- 空间换时间(越长碰撞越少,内存消耗越多,查找和插入速率越接近O(1))
一万,一千万,一亿数据需要多少空间:
1万数据,1个数据1Byte
1,0000 -> 10,000 大约10KB
1千万数据,1个数据1Byte
1000,0000 -> 10,000,000 大约10M
1亿数据,1个数据1Byte
10000,0000 -> 100,000,000 大约100M
10亿数据,1个数据1Byte
10,0000,0000 -> 1,000,000,000 大约1G
1Byte = 8bit 表示最大数值 2^8 = 256
2Byte = 2*8bit 表示最大数值 2^16 = 65536 = 6,5536(约6千) = 65,536
4Byte = 4*8bit 表示最大数值 2^32 = 4294967296 = 42,9496,7296(约42亿) = 4,294,967,296
32位机器,地址4个字节表示,寻址就是42,9496,7296(约42亿),所以内存最多可以用4G,但不是所有地址都用于内存,所以内存最大支持会小于4G。