哈希(散列)表、哈希函数基本知识

本文介绍了哈希表的概念,强调了哈希函数在查找过程中的重要性,指出好的哈希函数应使冲突尽可能少。接着讨论了哈希函数的构建方法,包括数字分析法、平方取中法、折叠法和除留余数法,并解释了处理冲突的开放定址法,如线性探测、二次探测和伪随机探测再散列。
摘要由CSDN通过智能技术生成

哈希表

在这里插入图片描述

这些查找方法的特点:记录在表中的位置和其关键字间不存在确定关系,查找的过程为给定值依次和各个关键字进行比较,查找的效率取决进行比较的关键字个数。它们的平均查找长度(ASL)都不为0.

若希望ASL=0
方法:预先知道所查关键字在表中的位置。
即:记录在表中位置和其关键字之间的确定关系。

在一般情况下,需在关键字和记录在表中的存储位置之间建立一个函数关系,以f(key)作为关键字为key的记录在表中的位置,通常称这个函数f(key)为哈希函数
哈希函数是一个映像,即:将关键字的集合映射到某个地址集合上。

例子:
在这里插入图片描述
对哈希表进行查找的时候,待查记录不需要和其他关键字相比较,就可以发现查找是成功的还是失败的。

如果上例要添加Zhou怎么办呢?哈希表中13的位置已经有了Zhao,Zhou只能寻找下一个能够存放的空闲区域,这种就是冲突情况

在一般情况下,容易产生“冲突”现象,key1 ≠ key2,而f(key1)= f(key2)
很难找到一个不产生冲突的哈希函数。一

非加密哈希散列函数可以用多种算法实现,其中比较常用的有MD5、SHA-1、SHA-256等。下面以SHA-256为例,介绍如何用C语言实现非加密哈希散列函数。 首先,我们需要用到一个SHA-256的库,比较常用的有openssl库和libgcrypt库。这里我们以openssl库为例,需要在代码中include openssl/sha.h头文件,并链接libssl库。具体实现如下: ```c #include <stdio.h> #include <string.h> #include <openssl/sha.h> int main() { char str[] = "hello world"; unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256(str, strlen(str), hash); int i; for(i = 0; i < SHA256_DIGEST_LENGTH; i++) { printf("%02x", hash[i]); } printf("\n"); return 0; } ``` 上面的代码中,我们将字符串"hello world"进行SHA-256哈希哈希结果存储在hash数组中,然后将hash数组中的每个字节以16进制形式输出。输出结果为: ``` b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 ``` 这就是字符串"hello world"的SHA-256哈希值。 需要注意的是,SHA-256哈希值的长度为32字节,因此我们定义了一个长度为32的unsigned char数组来存储哈希值。如果使用其他哈希算法,哈希值的长度可能不同,需要相应地调整数组的长度。 另外,由于SHA-256是一种加密哈希算法,其安全性比较高,但运算速度相对较慢。如果只需要实现非加密哈希散列函数,可以考虑使用一些速度更快的算法,如MurmurHash、CityHash等。这些算法的实现比较简单,可以在网上找到相关的代码库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值