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;