。net中哈希函数基础问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了。net中哈希函数基础问题相关的知识,希望对你有一定的参考价值。

题目如图 请高人耐心解答

参考技术A 哈希表
一般的线性表、树中,记录在结构中的相对位置是随机的即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较”的基础上,查找的效率与比较次数密切相关。理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。因而查找时,只需根据这个对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需要进行比较便可直接取得所查记录。在此,称这个对应关系f为哈希函数,按这个思想建立的表为哈希表(又称为杂凑法或散列法)。

哈希表不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址 即key1≠key2,而f(key1)=f(key2)。具有相同函数值的关键字对该哈希函数来说称为同义词(synonym)。 因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。可如下描述哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集(区间)上并以关键字在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。

注:这个函数f(key)为哈希函数。(注意:这个函数并不一定是数学函数) 哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。 现实中哈希函数是需要构造的,并且构造的好才能使用的好。 这个函数f(key)为哈希函数。(注意:这个函数并不一定是数学函数) 哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵

对于动态查找表而言,1) 表长不确定;2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字。因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的位置,通常称这个函数f(key)为哈希函数。(注意:这个函数并不一定是数学函数)

哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。

通俗地讲哈希表是一些键值对的组合,如
Hashtable hs = new Hashtable();
hs.Add('1',sdf);
hs.Add('2',hreh);
hs.Add('3',dh55);
他的键是不能重复的。
我们通过它的键就可以得到他的值,如像,我们要得到dh55.
只需hs['3']就可以得到dh55

完整的哈希表还支持
hs[0];//sdf
hs[1];//hreh
......
也就是按照添加顺序从零开始(也就是数组)方式读写数据 asp.net支持完整的哈希表,php、js等不支持完整的,也就是不存在hs[0]。

HashCode就是一个散列码。一般情况下,如果hashCode相同,则equals应该也判定相等。就像MD5一样,但没MD5那么复杂。

散列的价值在于速度,使得查询得以快速进行。

查询一个值的过程首先就是计算散列码,然后使用散列码查询数组。数组并不直接保存值,而是保存值的list。然后对list中的值使用equels()方法进行线性查询。这部分查询会比较慢,但是,如果散列函数好的话,数组的每个位置只有较少的值。因此不是查询真个list,而是快速的跳到数组的某个位置,只对少数的元素进行比较。

哈希技术

1. 哈希的定义

在数据元素的存储位置和它的关键字之间建立一个映射关系f,通过f可以直接得到关键字所代表的数据元素

 

2. 哈希表

哈希技术中用于存储数据元素的数据结构

 

3. 哈希函数

哈希技术中的映射关系f

 

4. 哈希技术的关键点

① 哈希表:哈希技术需要具体的数据结构为基础,如数组、链表、二叉树......

②哈希函数:哈希技术需要映射关键字和数据元素的存储位置,依赖于数学运算,如四则运算、逻辑运算、比较......

 

5. 哈希的操作

① 创建哈希: Hash* Hash_Create();
② 销毁哈希: void Hash_Destroy(Hash* hash);
③ 清空哈希: void Hash_Clear(Hash* hash);
④ 加入键值对: int Hash_Add(Hash* hash, HashKey* key, HashValue* value);
⑤ 删除键值对: HashValue* Hash_Remove (Hash* hash, HashKey* key);
⑥ 根据建获取值: HashValue* Hash_Get(Hash* hash, HashKey* key);
⑦ 获取键值对数目: int Hash_Count(Hash* hash);

 

6. 哈希的实现

数组是最简单也是最高效的哈希实现







以上是关于。net中哈希函数基础问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 Visual Studio C# .NET 将哈希函数 Insertio 处理到 MySql 数据库中

可以使用 CRC32C 作为基础构造一个“好”的哈希函数吗?

公钥、私钥、哈希、加密算法基础概念

我应该选择哪种加密哈希函数?

哈希技术

基础普及(15):一分钟搞懂哈希以及哈希算法!