hash.h
#ifndef HASH_H #define HASH_H 1 #include <stdio.h> #include <time.h> #include <string.h> #include <malloc.h> #include <list.h> #define NMN_USER_HASH_LIST_MAX 1024 struct user { struct hlist_node sibling; char username[32]; /* * char userpwd[NMN_VALUE_MAX_LEN]; */ time_t starttime; time_t endtime; }; extern int user_count; extern int hash_test[NMN_USER_HASH_LIST_MAX]; extern struct hlist_head hash_listhead[NMN_USER_HASH_LIST_MAX]; /* int str2user(struct user *user_entry, const char *username, const char *userpwd); int user2str(char *buf, int buf_len, const struct user *user_entry); //*/ int read_users_list(const char *file_path); struct user *user_hash_get(const char *username); //#undef HASH_LIST_MAX #endif /* HASH_H */
hash.c
#include <hash.h> struct hlist_head hash_listhead[NMN_USER_HASH_LIST_MAX]; int user_count; static unsigned int bkdrhash(const char *str) { unsigned int seed = 1313; //13 131 1313 13131 131313 etc... unsigned int hash = 0; while(*str) { hash = hash * seed + (unsigned int)(*str++); } return hash & 0x7FFFFFFF; } static int get_name_hash_index(const char *username) { unsigned int key = bkdrhash(username); int index = key & (NMN_USER_HASH_LIST_MAX-1); return index; } static int user_hash_push(struct user *entry) { int index = get_name_hash_index(entry->username); hlist_add_head(&entry->sibling, &hash_listhead[index]); return 0; } /* static int user_cmp(const struct user *a, const struct user *b) { return strcmp(a->username, b->username); } //*/ struct user *user_hash_get(const char *username) { struct user *tpos; struct user *ret = NULL; struct hlist_node *pos; int index = get_name_hash_index(username); hlist_for_each_entry(tpos, pos, &hash_listhead[index], sibling) { fprintf(stdout, "username=%s...\n", tpos->username); if(0==strcmp(username, tpos->username)) { ret = tpos; break; } } return ret; } /* static int line2user(struct user *entry, const char *line) { sscanf(line, "%s Cleartext-Password := \"%[^\"]%*[ #\"]%ld-%ld", entry->username, entry->userpwd, &entry->starttime, &entry->endtime); return 0; } //*/ /* without userpwd */ static int line2user(struct user *entry, const char *line) { return sscanf(line, "%s Cleartext-Password := \"%*[^\"]%*[ #\"]%ld-%ld", entry->username, &entry->starttime, &entry->endtime); } int read_users_list(const char *dir_path) { int ret = 0; user_count = 0; char file_path[1024]; snprintf(file_path, sizeof(file_path), "%s", dir_path); FILE *fp = fopen(file_path, "r"); if(NULL==fp) { return -1; } char line[1024]; struct user *entry; while(NULL != (fgets(line, sizeof(line), fp))) { if(('#'==*line) || (!strstr(line, "Cleartext-Password"))) { continue; } entry = (struct user *)malloc(sizeof(struct user)); if(!entry) { ret = -1; break; } line2user(entry, line); user_hash_push(entry); ++user_count; } fclose(fp); return ret; } /* 暂无释放链表方法实现 */