在实际开发过程中,往往需求类似一个问题--这个对象是否已经存在? et.
如果我们讲每个对象建立一个诸如这样的structure
struct OBJECT
{
char* szName,
int i_hash,
....
};
那么可以建立一个 object libary,根据 szName 计算出一个唯一的Hash值,这样建立一个Hash表,查找的时候可以选择2分法等查找是否对象已经建立.
///关键代码
//取得Hash 值
typedef unsigned int uint32_t;
uint32_t HashString(const char *pszString)
{
uint32_t i_hash;
while(*pszString)
{
i_hash += *pszString++;
i_hash += i_hash << 10;
i_hash ^= i_hash >> 8;
}
return i_hash;
}
//建立一个Hash表
static int InsertInner( void *p_vars, int i_count, uint32_t i_hash )
{
int i_middle;
if( i_hash <= p_vars[0].i_hash )
{
return 0;
}
if( i_hash >= p_vars[i_count - 1].i_hash )
{
return i_count;
}
i_middle = i_count / 2;
/* We know that 0 < i_middle */
if( i_hash < p_vars[i_middle].i_hash )
{
return InsertInner( p_vars, i_middle, i_hash );
}
/* We know that i_middle + 1 < i_count */
if( i_hash > p_vars[i_middle + 1].i_hash )
{
return i_middle + 1 + InsertInner( p_vars + i_middle + 1,
i_count - i_middle - 1,
i_hash );
}
return i_middle + 1;
}
//查找
static int LookupInner( variable_t *p_vars, int i_count, uint32_t i_hash )
{
int i_middle;
if( i_hash <= p_vars[0].i_hash )
{
return 0;
}
if( i_hash >= p_vars[i_count-1].i_hash )
{
return i_count - 1;
}
i_middle = i_count / 2;
/* We know that 0 < i_middle */
if( i_hash < p_vars[i_middle].i_hash )
{
return LookupInner( p_vars, i_middle, i_hash );
}
/* We know that i_middle + 1 < i_count */
if( i_hash > p_vars[i_middle].i_hash )
{
return i_middle + LookupInner( p_vars + i_middle,
i_count - i_middle,
i_hash );
}
return i_middle;
}
如果我们讲每个对象建立一个诸如这样的structure
struct OBJECT
{
char* szName,
int i_hash,
....
};
那么可以建立一个 object libary,根据 szName 计算出一个唯一的Hash值,这样建立一个Hash表,查找的时候可以选择2分法等查找是否对象已经建立.
///关键代码
//取得Hash 值
typedef unsigned int uint32_t;
uint32_t HashString(const char *pszString)
{
uint32_t i_hash;
while(*pszString)
{
i_hash += *pszString++;
i_hash += i_hash << 10;
i_hash ^= i_hash >> 8;
}
return i_hash;
}
//建立一个Hash表
static int InsertInner( void *p_vars, int i_count, uint32_t i_hash )
{
int i_middle;
if( i_hash <= p_vars[0].i_hash )
{
return 0;
}
if( i_hash >= p_vars[i_count - 1].i_hash )
{
return i_count;
}
i_middle = i_count / 2;
/* We know that 0 < i_middle */
if( i_hash < p_vars[i_middle].i_hash )
{
return InsertInner( p_vars, i_middle, i_hash );
}
/* We know that i_middle + 1 < i_count */
if( i_hash > p_vars[i_middle + 1].i_hash )
{
return i_middle + 1 + InsertInner( p_vars + i_middle + 1,
i_count - i_middle - 1,
i_hash );
}
return i_middle + 1;
}
//查找
static int LookupInner( variable_t *p_vars, int i_count, uint32_t i_hash )
{
int i_middle;
if( i_hash <= p_vars[0].i_hash )
{
return 0;
}
if( i_hash >= p_vars[i_count-1].i_hash )
{
return i_count - 1;
}
i_middle = i_count / 2;
/* We know that 0 < i_middle */
if( i_hash < p_vars[i_middle].i_hash )
{
return LookupInner( p_vars, i_middle, i_hash );
}
/* We know that i_middle + 1 < i_count */
if( i_hash > p_vars[i_middle].i_hash )
{
return i_middle + LookupInner( p_vars + i_middle,
i_count - i_middle,
i_hash );
}
return i_middle;
}