⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bb_hash.c

📁 早期freebsd实现
💻 C
字号:
/* ****************************************************************************** * * Module: bb_hash.c * * Functions:  *	    bb_put_hash()	- Place an entry in the hash table. *	    bb_get_hash()	- Return an index from the hash table. * * ****************************************************************************** *//* ****************************************************************************** * Include Files ****************************************************************************** */#include <stdio.h>#include <rpc/rpc.h>#include "common.h"#include "protocol.h"#include "server.h"static BB_hash		bb_hash;	/* The hash table of id, index.	*/static BB_co_data	bb_co_d[BB_MAX_IMP]; /* The company data table.	*/intbb_put_hash( id, index)  BB_id		id;		/* The identifier to hash.		*/  int		index;		/* Index of this record in co. data tbl.*/{    int		i;		/* Nice loop variable name.		*/    int		hash_idx = 0;	/* Index into hash table.		*/    int		term_idx;	/* Termination index of circular search.*/    /*    **  Sum up all of the characters in the id and mod it by the    **  hash list size.  This is the initial hash index.    */    for( i = 0; (id[i] != NUL) && (i < BB_ID_NAME_LEN); i++)    {	hash_idx += id[i];    }    hash_idx = term_idx = (hash_idx % BB_MAX_HASH);    /*    **  Search the table for the first open hash bucket.  If the hash    **  table does not contain one break at the termination index.    */    while( bb_hash[hash_idx].id_ptr != NULL )    {	hash_idx = ((hash_idx + 1) % BB_MAX_HASH);	if ( hash_idx == term_idx )	    break;    }        /*    **  If the hash bucket is empty then install the info here.    **  Otherwise the table is full.    */    if ( bb_hash[hash_idx].id_ptr == NULL )    {	bb_hash[hash_idx].index  = index;	bb_hash[hash_idx].id_ptr = id;	return BB_SUCCESS;    }    else    {	return BB_HASH_TABLE_FULL;    }}intbb_get_hash( id)  BB_id		id;		/* The identifier to hash.		*/{    int		i;		/* Nice loop variable name.		*/    int		hash_idx = 0;	/* Index into hash table.		*/    int		term_idx;	/* Termination index of circular search.*/    /*    **  Sum up all of the characters in the id and mod it by the    **  hash list size.  This is the initial hash index.    */    for( i = 0; (id[i] != NUL) && (i < BB_ID_NAME_LEN); i++)    {	hash_idx += id[i];    }    hash_idx = term_idx = (hash_idx % BB_MAX_HASH);    /*    **  Search the hash table based upon the initial index.  The search    **  ends when the index is found or one complete cycle of the hash    **  table has been done.  This is linear resolution.    */    while( ( bb_hash[hash_idx].id_ptr != NULL ) && 	   ( strncmp( bb_hash[hash_idx].id_ptr, id, BB_ID_NAME_LEN) != 0 ) )    {	hash_idx = ((hash_idx + 1) % BB_MAX_HASH);	if ( hash_idx == term_idx )	    break;    }        /*    **  If the id is equal to that of the hash bucket then a match is     **  found.  Otherwise the table does not contain this id.    */    if ( ( bb_hash[hash_idx].id_ptr != NUL ) &&	 ( strncmp( bb_hash[hash_idx].id_ptr, id, BB_ID_NAME_LEN) == 0 ) )    {	return bb_hash[hash_idx].index;    }    else    {	return BB_HASH_ID_NOT_FOUND;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -