青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

無(wú)我

讓內(nèi)心永遠(yuǎn)燃燒著偉大的光明的精神之火!
靈活的思考,嚴(yán)謹(jǐn)?shù)膶?shí)現(xiàn)
豪邁的氣魄、頑強(qiáng)的意志和周全的思考

剖析eSNACC哈希結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn)

本文剖析hash.h/c,從源代碼來(lái)剖析eSNACC哈希結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn)。 

為什么要在這里剖析hash呢?一個(gè)順理成章的理由是:我們準(zhǔn)備剖析eSNACC對(duì)ANY(s)類(lèi)型的編碼和解碼,可是ANY的實(shí)現(xiàn)依賴(lài)于hash,所以我們就需要先把這條路打通了。O(∩_∩)O哈哈~是不是很有說(shuō)服力呀?

 

好,閑話少述,言規(guī)正傳。我們知道hash對(duì)一個(gè)系統(tǒng)而言,一般都是一個(gè)很有價(jià)值的底層基礎(chǔ)設(shè)施。從作用上來(lái)說(shuō),他實(shí)現(xiàn)的優(yōu)劣極大的影響著整個(gè)系統(tǒng)的性能。從技術(shù)上來(lái)說(shuō),也是很能體現(xiàn)含金量的一個(gè)模塊。所以,對(duì)eSNACC實(shí)現(xiàn)的這個(gè)寶藏,我們下定決心要刨根問(wèn)底、直搗黃龍!

 

友情說(shuō)明:本文不討論eSNACC用的hash函數(shù),因?yàn)槲覀冇昧肆硗猹?dú)立的一篇文章來(lái)研究:剖析eSNACC的hash函數(shù)。本文研究的是eSNACC哈希結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn)。

 

先看頭文件:

#ifndef _asn_hash_h_
#define _asn_hash_h_

#ifdef __cplusplus
extern "C" {
#endif


#define TABLESIZE 256
#define INDEXMASK 0xFF
#define INDEXSHIFT 8

typedef 
void *Table[TABLESIZE];

typedef unsigned 
int Hash;

typedef 
struct HashSlot
{
  
int    leaf;
  Hash   hash;
  
void  *value;
  Table 
*table;
}
 HashSlot;

Hash MakeHash PROTO ((
char *str, unsigned long  len));

Table 
*InitHash();

int Insert PROTO ((Table *table, void *element, Hash hash));

int CheckFor PROTO ((Table *table, Hash hash));

int CheckForAndReturnValue PROTO ((Table *table, Hash hash, void **value));

#ifdef __cplusplus
}

#endif

#endif /* conditional include */

在這里,就利用這個(gè)頭文件,我想先和大家講清楚eSNACC的hash表的設(shè)計(jì)結(jié)構(gòu)。

首先,eSNACC的每一個(gè)hash值用unsigned int來(lái)定義:typedef unsigned int Hash。

然后,定義的hash表結(jié)構(gòu)——Table:typedef void *Table[TABLESIZE],是一個(gè)256維的指針數(shù)組。

那這個(gè)數(shù)組每個(gè)元素的內(nèi)容是什么呢?是指向HashSlot結(jié)構(gòu)的指針,也就是這個(gè)hash表的每一維是一個(gè)HashSlot。但是如果這樣,只能存放256個(gè)值呀,怎樣實(shí)現(xiàn)hash的呢?這個(gè)我們就要理解HashSlot的各個(gè)變量的意義了:

int    leaf : 當(dāng)前HashSlot是不是樹(shù)的葉子。
Hash   hash :當(dāng)前HashSlot元素的hash值。
void  *value :對(duì)應(yīng)當(dāng)前hash值元素內(nèi)容,也就是實(shí)際值。
Table *table :如果當(dāng)前HashSlot不是葉子,也就是說(shuō)在當(dāng)前hash有多個(gè)共用的元素,那么本字段就不為空,而是指向再次hash的表。

我做了一張簡(jiǎn)單的示意圖來(lái)描述:

雖然不美觀,但還是希望你能從中看明白這個(gè)hash表的結(jié)構(gòu)哦。

 

 

/******************************休息一下************************************

好了,有了對(duì)整個(gè)hash表設(shè)計(jì)的理解,我們就來(lái)研究具體的hash表操作函數(shù)

/* Creates and clears a new hash slot */
static HashSlot * NewHashSlot()
{
  HashSlot 
*foo;

  foo 
=  new HashSlot;
  
if (foo == NULL)
      
return NULL;
  memset (foo, 
0sizeof (HashSlot));
  
return foo;
}


/* Create a new cleared hash table */
static Table *NewTable()
{
  Table 
*new_table;

//  new_table = new Table;
// whose bug is it that gcc won't compile the above line?
  new_table = (Table *new Table;
  
if (new_table == NULL)
      
return NULL;
  memset (new_table, 
0sizeof (Table));
  
return new_table;
}


/* This routine is used to initialize the hash tables. When it is called
 * it returns a value which is used to identify which hash table
 * a particular request is to operate on.
 
*/

Table 
* InitHash()
{
  Table 
*table;
  table 
= NewTable();
  
if (table == NULL)
      
return 0;
  
else
      
return table;
}

上面三個(gè)很簡(jiǎn)單,前兩個(gè)調(diào)用new創(chuàng)建HashSlot和Table,第三個(gè)就是用來(lái)初始最上層hash表的函數(shù)。

 

下面我們來(lái)看看將一個(gè)hash值為hash_value的元素element插入到哈希表table的具體實(shí)現(xiàn):

/* This routine takes a hash table identifier, an element (value) and the
 * coresponding hash value for that element and enters it into the table
 * assuming it isn't already there.
 
*/

int Insert (Table *table, void *element, Hash hash_value)
{
  HashSlot 
*entry;

  entry 
= (HashSlot *) (*table)[hash_value & INDEXMASK];

  
if (entry == NULL) {
    
/* Need to add this element here */
    entry 
= NewHashSlot();
    
if (entry == NULL)
        
return false;
    entry
->leaf = true;
    entry
->value = element;
    entry
->hash = hash_value;
    (
*table)[hash_value & INDEXMASK] = entry;
    
return true;
  }


  
if (hash_value == entry->hash)
      
return false;

  
if (entry->leaf)
      
return SplitAndInsert (entry, element, hash_value);

  
return Insert (entry->table, element, hash_value >> INDEXSHIFT);
}

函數(shù)利用hash_value的最后一個(gè)字節(jié)來(lái)判斷該元素應(yīng)該放在table中的維數(shù),并且取出該維對(duì)應(yīng)的HashSlot entry。

如果entry為空,那么也就是對(duì)應(yīng)該hash_value還沒(méi)有元素,可以直接創(chuàng)建HashSlot,設(shè)定entry的value為element,hash為hash_value,因?yàn)楫?dāng)前只有這一個(gè)值,所以本HashSlot就是葉子,其table成員也為空。然后將該新的entry連到table的對(duì)應(yīng)維上,完成。

如果entry不為空,依次判斷以下三種情況:

1、如果當(dāng)前entry的hash等于hash_value,那就是hash值沖突,直接返回false。

2、如果當(dāng)前entry是葉子,那么就得拆分當(dāng)前HashSlot,使得他用table來(lái)存放多個(gè)值。

3、如果entry不是葉子了,那么就將本元素插到entry->table里面。

我們看一下SplitAndInsert:

/* When a hash collision occurs at a leaf slot this routine is called to
 * split the entry and add a new level to the tree at this point.
 
*/

static int SplitAndInsert (HashSlot *entry, void *element, Hash hash_value)
{

  
if (((entry->table = NewTable()) == NULL) ||
      
!Insert (entry->table, entry->value, entry->hash >> INDEXSHIFT) ||
      
!Insert (entry->table, element, hash_value >> INDEXSHIFT))
    
return false;

  entry
->leaf = false;
  
return true;
}

恩,很清楚,首先為entry的table分配一個(gè)Table,接著再將entry中原來(lái)存的值(entry->vlaue,entry->hash)插到表里,然后還將新加入的值(element,hash_value)插入表里。最后將entry的葉子屬性改為非葉子。

注意:在級(jí)聯(lián)的hash表里存的不是原來(lái)的hash值,而是依次將hash>>8.也就是出了最高層的哈希表,其他的都依次去掉最末尾的一個(gè)字節(jié)?。?!

 

我們模擬插入兩個(gè)元素,假設(shè)其值和hash分別為A("tim",0xAA02),B("eSNACC",0xBB02).只是為了說(shuō)明,我們假設(shè)原始table為空:

1,插入A:hash_value=0xAA02,所以應(yīng)當(dāng)插入到table的第三維,插入以后應(yīng)當(dāng)為:

2.插入B:hash_value=0xBB02,hash_value & 0xFF=2,所以又找到第三位,然后此時(shí)有HashSlot葉子,所以需要拆分,在插入后應(yīng)當(dāng)為:

利用這兩個(gè)圖,應(yīng)該說(shuō)得很清楚了吧,還是圖最清楚了!O(∩_∩)O哈哈~

 

好了,讓我們來(lái)看最后兩個(gè)函數(shù):

/* This routine looks to see if a particular hash value is already stored in
 * the table. It returns true if it is and false otherwise.
 
*/

int CheckFor (Table *table, Hash hash)
{
  HashSlot 
*entry;

  entry 
= (HashSlot *) table[hash & INDEXMASK];

  
if (entry == NULL)
      
return false;
  
if (entry->leaf)
      
return entry->hash == hash;
  
return CheckFor (entry->table, hash >> INDEXSHIFT);
}


/* In addition to checking for a hash value in the tree this function also
 * returns the coresponding element value into the space pointed to by
 * the value parameter. If the hash value isn't found false is returned
 * the the space pointed to by value is not changed.
 
*/

int CheckForAndReturnValue (Table *table, Hash hash, void **value)
{
  HashSlot 
*entry;
  
if (table)
  
{
      entry 
= (HashSlot *) (*table)[hash & INDEXMASK];

      
if (entry == NULL)
          
return false;

      
if (entry->leaf)
      
{
          
if (entry->hash == hash)
          
{
              
*value = entry->value;
              
return true;
          }

          
else
              
return false;
      }

      
return CheckForAndReturnValue (entry->table, hash >> INDEXSHIFT, value);
  }

  
else
     
return false;
}

這兩個(gè)函數(shù)功能很清晰,就是在給定的哈希表table查找對(duì)應(yīng)哈希值為hash的元素。只是CheckFor只是檢查table存在此hash否。而CheckForAndReturnValue則在存在時(shí),將元素值存在value中返回。

 

好了,到此,eSNACC哈希結(jié)構(gòu)的設(shè)計(jì)就已經(jīng)全部分析完成了!祝大家學(xué)習(xí)愉快~

posted on 2012-04-26 15:36 Tim 閱讀(1783) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): eSNACC學(xué)習(xí)

評(píng)論

# re: 剖析eSNACC哈希結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn)[未登錄](méi) 2012-04-27 09:31 Tina

寫(xiě)的很好,圖的增加讓人很好理解。等待你的新作品!  回復(fù)  更多評(píng)論   

<2013年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(tǒng)計(jì)

公告

本博客原創(chuàng)文章,歡迎轉(zhuǎn)載和交流。不過(guò)請(qǐng)注明以下信息:
作者:TimWu
郵箱:timfly@yeah.net
來(lái)源:www.shnenglu.com/Tim
感謝您對(duì)我的支持!

留言簿(9)

隨筆分類(lèi)(173)

IT

Life

搜索

積分與排名

最新隨筆

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美不卡三区| 欧美国产先锋| 欧美电影在线观看完整版| 亚洲精品欧美| 欧美一区二区三区在线观看视频| 欧美1区2区视频| 国产精品看片你懂得| 在线观看一区二区精品视频| 在线视频欧美一区| 可以看av的网站久久看| 一区二区三区欧美成人| 久久色在线观看| 国产精品婷婷| 亚洲精品中文字幕在线观看| 久久国产精品久久久久久| 91久久精品一区二区别| 久久看片网站| 一区二区欧美日韩视频| 久久国产精品久久久| 91久久久久久久久久久久久| 午夜国产精品视频| 欧美成人国产| 激情视频一区| 亚欧美中日韩视频| 最新成人在线| 久久综合九色综合欧美狠狠| 国产性色一区二区| 亚洲一品av免费观看| 亚洲第一精品久久忘忧草社区| 欧美一区二区三区在线看 | 亚洲久久视频| 另类天堂视频在线观看| 亚洲性线免费观看视频成熟| 欧美激情精品久久久六区热门| 国内综合精品午夜久久资源| 亚洲欧美另类中文字幕| 亚洲人成精品久久久久| 久久综合一区| 黄色精品网站| 久久精品91久久久久久再现| 亚洲天堂av图片| 欧美午夜电影在线观看| 日韩午夜av在线| 亚洲第一页自拍| 久久在线免费| 在线欧美影院| 老巨人导航500精品| 性欧美精品高清| 国产欧美精品日韩精品| 亚洲欧美日韩在线播放| 一区二区欧美日韩| 欧美视频在线免费看| 一区二区三区毛片| 亚洲美洲欧洲综合国产一区| 欧美精品一区二区三区蜜臀| 亚洲精品一区二区三区蜜桃久| 欧美大香线蕉线伊人久久国产精品| 久久久国产精品一区| 狠狠色综合色区| 老司机免费视频久久| 久久成人久久爱| 精品成人在线| 欧美成人精品激情在线观看| 久久亚洲私人国产精品va媚药 | 亚洲电影有码| 欧美成ee人免费视频| 快射av在线播放一区| 亚洲黄网站在线观看| 亚洲国产精品va在线观看黑人| 欧美成人精品在线观看| 亚洲精品国精品久久99热一| 亚洲黄色在线看| 欧美日韩三级| 亚洲欧美综合网| 香蕉久久夜色| 中文有码久久| 欧美亚洲专区| 韩国精品主播一区二区在线观看| 久久精品一区二区三区不卡牛牛| 久久成人精品视频| 在线精品视频一区二区| 亚洲电影av在线| 欧美日韩国产天堂| 亚洲综合日韩中文字幕v在线| 亚洲综合欧美日韩| 韩国精品在线观看| 亚洲二区免费| 欧美性理论片在线观看片免费| 亚洲欧美制服另类日韩| 欧美中文字幕视频| 91久久黄色| 一本一本久久| 国内精品嫩模av私拍在线观看| 欧美高清不卡| 国产精品草莓在线免费观看| 欧美一区二区三区四区高清| 久久先锋影音| 亚洲午夜精品在线| 欧美在线视频a| 亚洲美女黄网| 午夜精品久久久久久久久久久| 亚洲福利视频一区二区| av成人免费在线| 一区在线电影| 一区二区日韩免费看| 黄色亚洲大片免费在线观看| 91久久综合亚洲鲁鲁五月天| 亚洲精品乱码久久久久久按摩观| 亚洲高清在线精品| 国产精品伦一区| 欧美成人日韩| 国产精品毛片a∨一区二区三区|国 | 久久国产一区| 亚洲视频第一页| 久久狠狠亚洲综合| 99国内精品久久| 久久不见久久见免费视频1| 日韩系列在线| 久久精品人人爽| 亚洲嫩草精品久久| 另类天堂视频在线观看| 新67194成人永久网站| 欧美国产日韩一二三区| 久久久久国产精品麻豆ai换脸| 欧美了一区在线观看| 久久夜色精品国产欧美乱极品| 欧美三区视频| 亚洲第一网站免费视频| 国产欧美 在线欧美| 亚洲国产专区| 国产综合一区二区| 夜夜嗨网站十八久久| 一区二区自拍| 午夜精品福利在线| 在线视频欧美精品| 牛夜精品久久久久久久99黑人| 欧美在线首页| 欧美午夜精品电影| 亚洲国产日韩欧美在线图片| 黄色成人在线网址| 亚洲欧美一区二区激情| 亚洲视频一区在线观看| 蜜臀99久久精品久久久久久软件| 久久国产精品久久精品国产| 国产精品ⅴa在线观看h| 亚洲国产精品一区| 在线观看日韩av电影| 午夜影视日本亚洲欧洲精品| 亚洲自拍三区| 欧美日韩午夜视频在线观看| 欧美激情视频在线播放| 黄色亚洲在线| 久久电影一区| 久久精品国产一区二区三| 国产精品多人| 中日韩高清电影网| 亚洲小视频在线| 欧美另类在线观看| 亚洲韩国精品一区| 亚洲黄色天堂| 欧美成人国产| 欧美韩国日本一区| 在线观看精品一区| 久久精品视频一| 麻豆精品国产91久久久久久| 精品不卡在线| 久久蜜桃精品| 免费人成精品欧美精品| 亚洲男同1069视频| 欧美日韩123| 亚洲久久成人| 一区二区欧美精品| 欧美日韩国产精品专区 | 欧美激情视频在线免费观看 欧美视频免费一| 免费不卡在线观看av| 伊人久久大香线| 久久综合九色九九| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美日韩一区二区三区免费看| 亚洲老板91色精品久久| 一区二区三区国产盗摄| 欧美日韩亚洲激情| 9色精品在线| 午夜精品视频一区| 国产欧美日韩在线视频| 欧美一区永久视频免费观看| 久热国产精品| 亚洲欧洲三级| 欧美日韩一区二区视频在线观看| 一区二区激情视频| 欧美亚洲一区二区在线观看| 国产亚洲欧美色| 久色成人在线| 亚洲精品免费观看| 亚洲欧美日韩成人| 国产一区二区三区四区五区美女| 久久久噜噜噜久久中文字幕色伊伊| 欧美电影免费观看高清完整版| 99在线精品视频| 国产精品一区二区久久久|