哈希(Hash)是一种加密算法,也称为散列函数或杂凑函数。哈希函数是一个公共函数,它能够将任何长度 M 的音讯映射到一个较短且固定长度的值 H(M),称为 H(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;
}