亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

c語言實現的hashtable分享

2020-01-26 15:37:36
字體:
來源:轉載
供稿:網友

頭文件 hashtable.h

復制代碼 代碼如下:

typedef struct _Bucket
{
    char *key;
    void *value;
    struct _Bucket *next;
} Bucket;

typedef struct _HashTable
{
    int size;
    int total;
    struct _Bucket *buckets;
} HashTable;

int hash_init(HashTable **ht);
int hash_find(HashTable *ht, char *key, void **result);
int hash_insert(HashTable *ht, char *key, void *value);
int hash_remove(HashTable *ht, char *key);
int hash_loop(HashTable *ht, void **result);
//int hash_index(HashTable *ht, char *key);
static unsigned int ELFHash(char *str, unsigned int length);

hashtable.c

復制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hashtable.h"
#include "mempool.h"
#include "log.h"

#define SUCCESS 1
#define FAILED 0
#define HASH_LEN 5

int hash_init(HashTable **ht) {
    (*ht) = (HashTable *)malloc(sizeof(HashTable));
    if (NULL == ht) {
        write_log("HashTable init error");
        exit(1);
    }
    (*ht)->size = 0;
    (*ht)->total = HASH_LEN;
    Bucket *bucket = (Bucket *)malloc(sizeof(Bucket) * HASH_LEN);
    memset(bucket, 0, sizeof(sizeof(Bucket) * HASH_LEN));
    (*ht)->buckets = bucket;
    return SUCCESS;
}

int hash_insert(HashTable *ht, char *key, void *value) {
    if (ht->size >= ht->total) {
        ht->buckets = (Bucket *)realloc(ht->buckets, sizeof(Bucket) * (ht->size + HASH_LEN));
        ht->total = ht->size + HASH_LEN;
    }
    int index = hash_index(ht, key);
    Bucket *bucket = &ht->buckets[index];
    int _tmpindex;
    char _tmpindexstr[20];
    while (NULL != bucket->value) {

        while (NULL != bucket->next) {
            if (strcmp(key, bucket->key) == 0) {
                memset(bucket->value, 0, sizeof(bucket->value));
                memcpy(bucket->value, value, sizeof(value));
                return SUCCESS;
            }
            bucket = bucket->next;
        }

        do {
            _tmpindex = abs(rand() - index);
            sprintf(_tmpindexstr, "%d", _tmpindex);
            _tmpindex = hash_index(ht, _tmpindexstr);
        } while (_tmpindex == index || ht->buckets[_tmpindex].value != NULL);

        index = _tmpindex;
        bucket->next = &ht->buckets[index];
        bucket = bucket->next;
    }

    bucket->key = (char *)malloc(sizeof(key));
    bucket->value = (void *)malloc(sizeof(value));
    memcpy(bucket->key, key, sizeof(key));
    memcpy(bucket->value, value, sizeof(value));
    bucket->next = NULL;
    ht->size ++;

    return SUCCESS;
}

int hash_find(HashTable *ht, char *key, void **result) {
    int index = hash_index(ht, key);
    Bucket *bucket = &ht->buckets[index];
    if (NULL == bucket->value) {
        return FAILED;
    }

    while (strcmp(key, bucket->key)) {
        if (NULL != bucket->next) {
            bucket = bucket->next;
        } else {
            break;
        }
    }
    if (NULL == bucket->value || strcmp(key, bucket->key)) {
        return FAILED;
    }

    *result = bucket->value;
    return SUCCESS;

}

int hash_delete(HashTable *ht, char *key) {
    int index = hash_index(ht, key);
    Bucket *bucket = &ht->buckets[index];
    if (NULL == bucket->value) {
        return FAILED;
    }

    while (strcmp(key, bucket->key)) {
        if (NULL != bucket->next) {
            bucket = bucket->next;
        } else {
            break;
        }
    }

    if (NULL == bucket->value || strcmp(key, bucket->key)) {
        return FAILED;
    }

    memset(bucket, 0, sizeof(Bucket));
    ht->size --;
    return SUCCESS;
}

void hash_status(HashTable *ht) {
    printf("Total Size:/t/t%d/n", ht->total);
    printf("Current Size:/t/t%d/n", ht->size);
}

int hash_index(HashTable *ht, char *key) {
    return ELFHash(key, ht->total);
}

// ELF Hash Function
static unsigned int ELFHash(char *str, unsigned int length){
    unsigned int hash = 0;
    unsigned int x = 0;

    while (*str)
    {
        hash = (hash << 4) + (*str++);//hash左移4位,把當前字符ASCII存入hash低四位。
        if ((x = hash & 0xF0000000L) != 0)
        {
            //如果最高的四位不為0,則說明字符多余7個,現在正在存第8個字符,如果不處理,再加下一個字符時,第一個字符會被移出,因此要有如下處理。
            //該處理,如果對于字符串(a-z 或者A-Z)就會僅僅影響5-8位,否則會影響5-31位,因為C語言使用的算數移位
            //因為1-4位剛剛存儲了新加入到字符,所以不能>>28
            hash ^= (x >> 24);
            //上面這行代碼并不會對X有影響,本身X和hash的高4位相同,下面這行代碼&~即對28-31(高4位)位清零。
            hash &= ~x;
        }
    }
    //返回一個符號位為0的數,即丟棄最高位,以免函數外產生影響。(我們可以考慮,如果只有字符,符號位不可能為負)
    return (hash & 0x7FFFFFFF) % length;
}

其中key的映射使用的是 ELFHash 算法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲一区二区三区久久| 亚洲第一综合天堂另类专| 中文字幕亚洲欧美一区二区三区| 精品视频偷偷看在线观看| 亚洲欧美在线第一页| 成人黄色影片在线| 欧美午夜久久久| 亚洲美女在线看| 日韩欧美极品在线观看| 日韩日本欧美亚洲| 亚洲欧美日韩国产中文专区| 国产成人久久久精品一区| 国产一区二区三区网站| 美日韩丰满少妇在线观看| 福利视频导航一区| 九九热精品视频国产| 欧美激情二区三区| 国产欧美日韩精品专区| 91在线|亚洲| 久久久久久久久国产精品| 日本精品视频在线播放| 欧美wwwxxxx| 日韩精品一区二区三区第95| 6080yy精品一区二区三区| 中文字幕av日韩| 成年无码av片在线| 日韩视频―中文字幕| 日韩欧美a级成人黄色| 国产欧美一区二区三区在线看| 亚洲美女久久久| 国产精品日韩精品| 日韩av在线网页| 国产亚洲一区二区精品| 国产精品免费看久久久香蕉| 国产精品成人在线| 欧美天天综合色影久久精品| 成人免费激情视频| 欧美成人激情图片网| 欧美精品电影免费在线观看| 国产日韩视频在线观看| 在线观看日韩欧美| 最近2019中文免费高清视频观看www99| 久久人人爽人人爽人人片亚洲| 午夜精品福利电影| 亚洲精品久久7777777| 亚洲图片制服诱惑| 成人国产精品一区| 日韩av三级在线观看| 亚洲精品乱码久久久久久按摩观| 自拍偷拍亚洲欧美| 视频在线观看99| 亚洲最大av网| 最近2019好看的中文字幕免费| 国产一区二区丝袜| 自拍亚洲一区欧美另类| 亚洲精品成人久久久| 日韩电影大全免费观看2023年上| 浅井舞香一区二区| 亚洲欧美综合图区| 国产欧美日韩视频| 亚洲色图美腿丝袜| 亚洲三级av在线| xxav国产精品美女主播| 亚洲www在线| 红桃视频成人在线观看| 欧美精品九九久久| 久久久最新网址| 欧美亚洲另类激情另类| 91嫩草在线视频| 国产成人a亚洲精品| 中文字幕亚洲欧美一区二区三区| 成人免费视频xnxx.com| 国产a∨精品一区二区三区不卡| 中文字幕亚洲情99在线| 久热精品在线视频| 在线日韩日本国产亚洲| 欧美性猛交xxx| 久久亚洲精品一区| 91精品成人久久| 日韩av中文字幕在线| 狠狠躁天天躁日日躁欧美| 亚洲精品电影网站| 国产成人高清激情视频在线观看| 亚洲第一区第一页| 久久人人爽人人| 欧美日韩中文字幕日韩欧美| 日韩中文在线观看| 欧美一级高清免费| 欧美乱人伦中文字幕在线| 日韩av电影在线网| 久久五月天综合| 国产精品一区二区三| 热re91久久精品国99热蜜臀| 欧美性感美女h网站在线观看免费| 97国产精品视频| 91久久夜色精品国产网站| 91综合免费在线| 91成人在线播放| 亚洲黄色av女优在线观看| 少妇高潮久久久久久潘金莲| 奇米成人av国产一区二区三区| 懂色aⅴ精品一区二区三区蜜月| 精品福利樱桃av导航| 欧美日韩在线免费| 亚洲欧美国产一区二区三区| 亚洲人成在线一二| 在线精品91av| 亚洲片国产一区一级在线观看| 欧美一区二区大胆人体摄影专业网站| 亚洲国模精品私拍| 国产精品久久久久av| 久久躁日日躁aaaaxxxx| 亚洲色图欧美制服丝袜另类第一页| 色悠悠久久久久| 亚洲欧美另类自拍| 久久久久久久激情视频| 欧美电影院免费观看| 国产成人精品视频| 成人黄色av网| 日韩av中文字幕在线| 日韩国产精品一区| 成人在线观看视频网站| 中文字幕日韩欧美在线| 成人av色在线观看| 国产精品a久久久久久| 欧美国产乱视频| 亚洲最大在线视频| 亚洲欧美一区二区精品久久久| 欧美孕妇性xx| 日韩欧美国产黄色| 尤物99国产成人精品视频| 国产精品视频资源| 国产精品自产拍在线观| 国产精品视频一区国模私拍| 欧美在线一区二区视频| 亚洲女人被黑人巨大进入| 亚洲男人第一网站| 日韩国产高清视频在线| 久久6免费高清热精品| 亚洲美女av在线| 欧美国产日韩xxxxx| 国产噜噜噜噜噜久久久久久久久| 欧美视频一二三| 国产精品99久久久久久久久久久久| 91热福利电影| 精品动漫一区二区三区| 日韩欧美精品网址| 国产在线视频一区| 九九精品在线观看| 影音先锋日韩有码| 九九热这里只有精品免费看| 欧美视频免费在线观看| 国模极品一区二区三区| 亚洲电影免费观看高清完整版在线观看| 日韩欧美精品网址| 91精品国产综合久久香蕉922| 国产男人精品视频| 久久天天躁狠狠躁夜夜躁2014| 亚洲精品电影网站| 亚洲天堂av综合网| 成人精品一区二区三区电影黑人| 亚洲第一精品电影| 欧美性videos高清精品| 国产欧美精品一区二区三区介绍|