android 的str_parms

android str_parms 是以一个string作为key的一系列参数, value可以是string ,int …
用hashmap实现

HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
Map中Key 和Value的, 增加一个对key值的Hash

数组+Bucket链表

hash的种类
  • 加法hash
    所有数相加
  • 乘法hash

int hashmapHash(void* key, size_t keySize) {
   
    int h = keySize;
    char* data = (char*) key;
    size_t i;
    for (i = 0; i < keySize; i++) {
   
        h = h * 31 + *data;   //特殊数31 ,也可以是131, 1313, 13131, 131313
        data++;
    }
    return h;
}
//这之后第二次hashing算法
{
   
    // We apply this secondary hashing discovered by Doug Lea to defend
    // against bad hashes.
    h += ~(h << 9);
    h ^= (((unsigned int) h) >> 14);
    h += (h << 4);
    h ^= (((unsigned int) h) >> 10);
}

typedef struct Entry Entry;
//Bucket的结构
struct Entry {
   
    void* key;   //key
    int hash;    //int hash值
    void* value;   //值
    Entry* next;
};

struct Hashmap {
   
    Entry** buckets;
    size_t bucketCount;
    int (*hash)(void* key);
    bool (*equals)(void* keyA, void* keyB);
    mutex_t lock; 
    size_t size;
};

//hash:自定义的生成hash的函数, 可以是上面的hashmapHash
//equals: 比较函数
Hashmap* hashmapCreate(size_t initialCapacity,
        int (*hash)(void* key), bool (*equals)(void* keyA, void* keyB)) {
   
    assert(hash != NULL);
    assert(equals != NULL);
    
    Hashmap* map = malloc(sizeof(Hashmap));
    if (map == NULL) {
   
        return NULL;
    }
    
    // 0.75 负载因子,根据这个扩容
    size_t minimumBucketCount = initialCapacity * 4 / 3;
    map->bucketCount = 1;
    while (map->bucketCount <= minimumBucketCount) {
   
        // Bucket count must be power of 2.
        map->bucketCount <<= 1; 
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值