哈希函数是一个公共函数,它可以将任何长度M的消息映射到一个、散列值(Hash Value)、杂凑值或者消息摘要。它是一种单向密码系统,即从明文到密文的不可逆映射。只有一个加密过程,但没有解密过程。
1、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。
2、负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同
的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。
3、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
4、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同
,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分
散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。
/*
* @Author: Carlos
* @Date: 2020-07-2 23:48:50
* @LastEditTime: 2020-07-2 23:48:50
* @LastEditors: Carlos
* @Description: Hash
*/
#include “stdio.h”
#include “stdlib.h”
#define HASHSIZE 7 //定义散列表长为数组的长度
#define NULLKEY -1
typedef struct
{
int *elem; //数据元素存储地址,动态分配数组
int count; //当前数据元素个数
} HashTable;
/**
* @Description: 哈希函数初始化
* @Param: HashTable *hashTable 结构体指针
* @Return: 无
* @Author: Carlos
*/
void Init(HashTable *hashTable)
{
int i;
hashTable->elem = (int *)malloc(HASHSIZE * sizeof(int));
hashTable->count = HASHSIZE;
for (i = 0; i < HASHSIZE; i++)
{
hashTable->elem[i] = NULLKEY;
}
}
/**
* @Description: 哈希函数(除留余数法)
* @Param: int data 哈希的数据
* @Return: 哈希后data存储的地址
* @Author: Carlos
*/
int Hash(int data)
{
return data % HASHSIZE;
}
/**
* @Description: 哈希表的插入函数,可用于构造哈希表
* @Param: HashTable *hashTable 结构体指针,int data 哈希的数据
* @Return: 无
* @Author: Carlos
*/
void Insert(HashTable *hashTable, int data)
{
int hashAddress = Hash(data); //求哈希地址
//发生冲突
while (hashTable->elem[hashAddress] != NULLKEY)
{
//利用开放定址法解决冲突
hashAddress = (++hashAddress) % HASHSIZE;
}
hashTable->elem[hashAddress] = data;
}
/**
* @Description: 哈希表的查找算法
* @Param: HashTable *hashTable 结构体指针,int data 哈希的数据
* @Return: 无
* @Author: Carlos
*/
int Search(HashTable *hashTable, int data)
{
int hashAddress = Hash(data); //求哈希地址
while (hashTable->elem[hashAddress] != data)
{ //发生冲突
//利用开放定址法解决冲突
hashAddress = (++hashAddress) % HASHSIZE;
//如果查找到的地址中数据为NULL,或者经过一圈的遍历回到原位置,则查找失败
if (hashTable->elem[hashAddress] == NULLKEY || hashAddress == Hash(data))
{
return -1;
}
}
return hashAddress;
}
int main()
{
int i, result;
HashTable hashTable;
int arr[HASHSIZE] = {13, 29, 27, 28, 26, 30, 38};
//初始化哈希表
Init(&hashTable);
//利用插入函数构造哈希表
for (i = 0; i < HASHSIZE; i++)
{
Insert(&hashTable, arr[i]);
}
//调用查找算法
result = Search(&hashTable, 29);
if (result == -1)
printf(“查找失败“);
else
printf(“29 在哈希表中的位置是:%d”, result + 1);
return 0;
}
温馨提示:仅提供区块链&数字货币平台信息分享服务,所有产品及展示信息均来源于发行方或者互联网。炒币属于投资行为,不等同于银行存款。市场有风险,投资需谨慎。投资虚拟货币有极大的风险,本网站提供的任何信息都不构成投资建议、财务咨询、交易咨询,或任何其他建议的依据,领域OK并不推荐您购买、售出或持有任何虚拟货币。在做出任何投资决定前,请先充分衡量风险。如有损失,请自行承担后果。