int WikiBookmark::wbm_copy_key(bookmark_key_t *k, const char *title, int len) { memset(k, 0, sizeof(bookmark_key_t)); crc32sum(title, len, &k->crc32, &k->r_crc32); k->len = len; return 0; }
int SHash::sh_fd_find(const void *key, void *value) { char buf[1024]; unsigned int next, crc32; unsigned int hash_value = 0; struct shm_hash_head *head = (struct shm_hash_head *)m_head; unsigned int offset; void *new_key; int ret_len; key_func(func_type, key, head->key_len, (void **)&new_key, &ret_len); crc32 = crc32sum((char *)new_key, ret_len) % head->hash; offset = m_pos + sizeof(struct shm_hash_head) + crc32 * sizeof(int); lseek(fd, offset, SEEK_SET); read(fd, &hash_value, sizeof(hash_value)); if (hash_value == 0) return _SHASH_NOT_FOUND; unsigned int rec_pos = sh_fd_get_rec(head); unsigned int rec_seek = sh_fd_get_pos(hash_value); for (;;) { memset(buf, 0, key_len + value_len + sizeof(int)); offset = m_pos + rec_pos + rec_seek; lseek(fd, offset, SEEK_SET); read(fd, buf, key_len + value_len + sizeof(int)); if (sh_record_is_used(buf)) { if (cmp_func(func_type, sh_get_key(buf), key, key_len) == 0) { memcpy(value, sh_get_value(buf), value_len); return _SHASH_FOUND; } } if ((next = sh_get_next(buf)) == 0) break; rec_seek = sh_fd_get_pos(next); } return _SHASH_NOT_FOUND; }
/* * _SHASH_FOUND * _SHASH_NOT_FOUND * _SHASH_NOT_FOUND_NEXT * _SHASH_SYS_ERROR */ int SHash::sh_sys_find(const void *key, void **value, unsigned int *crc32, void **used, void **find) { void *p; unsigned int next; int *hash; void *new_key; int ret_len; struct shm_hash_head *head = sh_get_head(); void *rec = sh_get_rec(head); key_func(func_type, key, key_len, (void **)&new_key, &ret_len); *crc32 = crc32sum((char *)new_key, ret_len) % head->hash; hash = sh_get_hash(head) + *crc32; if (*hash == 0) { return _SHASH_NOT_FOUND; } *find = p = sh_get_pos(rec, *hash); *used = NULL; for (;;) { *find = p; if (sh_record_is_used(*find)) { if (cmp_func(func_type, sh_get_key(p), key, key_len) == 0) { if (value) *value = sh_get_value(p); return _SHASH_FOUND; } } else { if (*used == NULL) *used = *find; } if ((next = sh_get_next(p)) == 0) break; p = sh_get_pos(rec, next); } return _SHASH_NOT_FOUND_NEXT; }
static int add_title_hash(const char *title) { struct title_key key; struct title_value value; memset(&key, 0, sizeof(key)); memset(&value, 0, sizeof(value)); value.len = strlen(title); crc32sum(title, value.len, &key.crc32, &key.r_crc32); m_title_hash->sh_replace(&key, &value); mylog("title:%s\n", title); return 0; }
static int find_title_hash(const char *title) { int len; struct title_key key; struct title_value *f; memset(&key, 0, sizeof(key)); len = strlen(title); crc32sum(title, len, &key.crc32, &key.r_crc32); if (m_title_hash->sh_find(&key, (void **)&f) == _SHASH_FOUND) { if (f->len == len) return 1; } return 0; }
int main(int argc, char **argv) { int i; if (argc == 1) { usage(); return 0; } if (check_options_quit(argc, argv)) { return 0; } if (!check_options_ok(argc, argv)) { return 1; } for (i = 1; i < argc; i++) { crc32sum(argv[i]); } return 0; }