`
ChristmasLin
  • 浏览: 41311 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

dbm之sdbm

    博客分类:
  • dbm
阅读更多

sdbm是 http://amisha.pragmaticdata.com/~schadow/dbm-java/ 上一个dbm的实现。sdbm主要由dir和page组成。它和w3c-dbm(见dbm之w3c-dbm)有所不同,w3c-dbm由dir和block组成。w3c-dbm的element保存时是区分索引和kv_content的,并且 kv_content 可以跨block w3c-dbm_block的,所以对kv的大小没限制。sdbm_page有点像hashmap的bucket,处理hash冲突时采用拉链法。因为sdbm_page是定长的,并且kv不能跨page,所以对于kv的大小限制受page大小影响。另一个区别是两者对dir的组织也不一样。w3c-dbm对dir的处理更像普通的hashmap,bucket数组,满时double dir。sdbm把dir作为一棵binary tree处理。此外,w3c-dbm使用一个文件来保存dir和kv的信息,sdbm则使用两个文件,一个保存dir信息,dir_file,另一个保存page,page_file。

 

sdbm之page:

 

page_file被划分一个个page,对应project的class Page。 Page 有3个属性:1.pag:bytes array;2.pageSize:size of pag;3.bno:page num,唯一,通过bno可以确定对应的page在page_file的偏移量。off(page)=page.bno*PAGE_SIZE。Page 还支持put_kv,get_kv,reove_kv 和 split_page等操作。

 

page在page_file的格式:

 

    *     +--------------------------------+

    * ino  | n | keyoff | datoff | keyoff |

    *     +------------+--------+--------+

    *        | datoff | - - - ---->   |

    *     +--------+----------------------+

    *        |    F R E E A R E A        |

    *     +--------------+----------------+

    *        |  <---- - - - | data          |

    *     +--------+-----+----+----------+

    *        |  key   | data     | key      |

    *     +--------+----------+-----------+

 

在page头的page_n(n),keyoff,datoff都是占2byes的short value。尾部的key,data则是kv的content。z中间则是可用空间。当插入一个新kv时,根据图示的两个箭头方向收缩可用空间。
ino:两个函数,getIno(int i),setIno(int i,new_ino)。主要是get/set page头第i个short value;
page_n:keyoff+datoff的个数,也就是kv_num*2。当page_n=0,free_area_begin=2,free_area_end=PAGE_SIZE;当page_n不等于0,getIno(page_n)就是最后一个kv的dataoff的值,该值就是free_area_end;
keyoff:所对应的key的偏移量;
datoff:所对应的data的偏移量;
1 kv所占的kv_space=2*2(short_len)+ k_len+v_len。

page的几个操作:
1.get_kv:只能遍历page的key;

2.put_kv:伪代码如下:
    int n=get_ino(0);
    int kv_off= n==0?page_size:get_ino(n);

   kv_off -= k_len;
   copy key to page[kv_off,kv_off+k_len];
   set_ino(n+1,kv_off);

   kv_off -= v_len;
   copy value to page[kv_off,kv_off+v_len];
   set_ino(n+2,kv_off);

   set_ino(0,n+2);
 
3.remove_kv:删除kv可能会出现free_area的空洞(当该kv不是last put kv),这时需要移动kv去覆盖空洞,并且更新受影响的keyoff 和datoff。最后set_ino(0,get_ino(0)-2);

4.split_page:接受2个参数new_page 和maskbit。split cur_page伪代码如下:
    Page temp_page;
    copy cur_page to temp_page;
    clear cur_page;
    clear new_page;

    for kv in temp_page{
        if hash(kv_k)&maskbit !=0 put kv to new_page;
        else put kv to cur_page;
    }
maskbit的作用在dir的分析中会解释。


sdbm之dir:

sdbm使用binary tree来 组件dir。所有的leaf node 对应1个page。
每个 binary tree node有1个状态位:是否有子节点。该信息保存在dir_file里,占1bit,dir_file的内容作为1个 bit array,每个bit对应二叉树的一个节点。对该状态的操作通过getdbit和setdbit来操作。

简单描述一下dir是如何工作的:
1.当只有1个page时,不需要使用目录树来定位page;
2.给出一个hash_value 定位page,假设当前目录树的结构如下:
|0|
|1| |2|
|3| |4|
 
从root(node0)开始,hash_value的每个bit(从低到高)如果是0则前进到左子节点,否则到 右子节点。直到没有子节点而停下,所到达的leaf node就是该hash_value对应的page,并且该page的bno为到达该节点的轨迹。例 如0x**01,定位到node2,page_2_bno=0x01. 0x**10定位到node4,page_4_bno=0x10.

3.split,假如在上文的树中,node2需要split,第2bit为1的移到新的page_6.
|0|
|1| |2|
|3| |4| |5| |6|

split后,page_2变为page_5,但是hash_value-->page的映射不变。
因为page_5_bno=0x01=page_2_bno.page_6_bno=0x11.


总结:
w3c-dbm和sdbm都是非常简单的kv store的两个实现,不支持事务,也不保证数据的可靠。但是通过分析这两个project,对hash如何结合disk来使用有一定的认识,这和in-memory的hash还是有一定的区别的。下一篇文章会分析jdbm的实现,它通过WAL(write-ahead-log)实现事务。并且对kv的组织和w3c-dbm,sdbm也不一样。
0
0
分享到:
评论

相关推荐

    sdbm:SDBM非加密哈希函数

    sdbm 非加密哈希函数安装$ npm install sdbm用法import sdbm from 'sdbm' ;sdbm ( ':unicorn::rainbow:' ) ;//=&gt; 4053542802 它以正整数形式返回哈希值。有关的 -FNV-1a非加密哈希函数 -DJB2a非加密哈希函数

    sdbm:sdbm源代码的Git镜像:tent:-git source code

    sdbm:sdbm源代码的Git镜像:tent:

    SDBM0003_表單管理.doc

    SDBM0003_表單管理.doc

    SDBM0002_簽核流程管理.doc

    SDBM0002_簽核流程管理.doc

    sdbm_portfolio

    Stacy D Brown-Martin投资组合 嗨,欢迎来到我的投资组合。 我将在这里展示我的Web开发工作。 如果您想聊天,合作或有工作机会,请与我们取得联系! 应用说明: ... 还使用了Bootstrap和Materialize框架。...

    20多个常用的Hash算法C++ 实现

    Hash函数集合,包含主流的hash函数: nginx_hash算法,OpenSSL_hash算法,RSHash,JSHash,PJWHash,ELFHash,BKDRHash,DJBHash,DEKHash,APHash等等!

    经典字符串hash函数

    几个经典字符串hash函数,SDBM/RS/JS/BKDR/DJB/AP HASH

    String2Hash:将字符串数组(文本)转换为哈希码-matlab开发

    sdbm(公共领域的重新实现ndbm) 数据库库。 发现它在加扰位方面做得很好, 导致更好的键分布和更少的分裂。 它也会发生成为具有良好分布的良好通用散列函数。 例子, hash=string2hash('你好世界'); 显示(哈希);

    python 实现hash 哈希算法 课程设计

    python 实现hash 哈希算法 课程设计 . 包括实现 Adler32 Chaos Machine Djb2 Elf ... Sdbm Sha1 Sha256 阿德勒32 混沌机器 DJB2 小精灵 谜机 海明码 卢恩 MD5 安全数据库 沙1 沙256

    python源代码计算hash值(MD5,SHA1,SHA256,LUHN等等)

    python实现计算hash哈希值通用算法的实现源代码 adler32.py chaos_machine.py djb2.py elf.py enigma_machine.py hamming_code.py luhn.py md5.py sdbm.pys ha1.py sha256.py

    各种Hash函数(JAVA版)

    SDBM-Hash Function Value: " + ghl.SDBMHash(key)); System.out.println(" 7. DJB-Hash Function Value: " + ghl.DJBHash(key)); System.out.println(" 8. DEK-Hash Function Value: " + ghl.DEKHash(key)); ...

    jshash:各种非加密哈希函数的JS实现

    节点 各种非加密哈希函数的 JS 实现。... jshash.sdbm : 使用的。 jshash.fnv1a : 哈希函数变体 1a。 jshash.murmur3 : 哈希函数版本 3。执照(麻省理工学院许可证) 版权所有 (c) 201X eterna2; 特此授予任何

    Java常用HASH算法总结【经典实例】

    主要介绍了Java常用HASH算法,结合实例形式总结分析了Java常用的Hash算法,包括加法hash、旋转hash、FNV算法、RS算法hash、PJW算法、ELF算法、BKDR算法、SDBM算法、DJB算法、DEK算法、AP算法等,需要的朋友可以参考下

    djb2a:DJB2a非加密哈希函数

    djb2a 非加密哈希函数安装$ npm install djb2a用法import djb2a from 'djb2a' ;djb2a ( ':unicorn::rainbow:' ) ;//=&gt; 1484783307 它以正整数形式返回哈希值。有关的 -FNV-1a非加密哈希函数 -SDBM非加密哈希函数

Global site tag (gtag.js) - Google Analytics