hash函数的选择

摘要:
在实践中人们普遍认识到,一个完美哈希的哈希函数,就是在一个特定的数据集上产生的的碰撞最少哈希的函数。在这篇文章中介绍的哈希函数被称为简单的哈希函数。这些哈希函数不是密码安全的,很容易通过颠倒和组合不同数据的方式产生完全相同的哈希值。

哈稀函数按照定义可以实现一个伪随机数生成器(PRNG),从这个角度可以得到一个公认的结论:哈希函数之间性能的比较可以通过比较其在伪随机生成方面的比较来衡量。

一般来说,对任意一类的数据存在一个理论上完美的哈希函数。这个完美的哈希函数定义是没有发生任何碰撞,这意味着没有出现重复的散列值。在现实中它很难找到一个完美的哈希散列函数,而且这种完美函数的趋近变种在实际应用中的作用是相当有限的。在实践中人们普遍认识到,一个完美哈希的哈希函数,就是在一个特定的数据集上产生的的碰撞最少哈希的函数。
我们所能做的就是通过试错方法来找到满足我们要求的哈希函数。可以从下面两个角度来选择哈希函数:
1.数据分布
一个衡量的措施是考虑一个哈希函数是否能将一组数据的哈希值进行很好的分布。要进行这种分析,需要知道碰撞的哈希值的个数,如果用链表来处理碰撞,则可以分析链表的平均长度,也可以分析散列值的分组数目。
2.哈希函数的效率
另个一个衡量的标准是哈希函数得到哈希值的效率。通常,包含哈希函数的算法的算法复杂度都假设为O(1),这就是为什么在哈希表中搜索数据的时间复杂度会被认为是"平均为O(1)的复杂度",而在另外一些常用的数据结构,比如图(通常被实现为红黑树),则被认为是O(logn)的复杂度。
一个好的哈希函数必须在理论上非常的快、稳定并且是可确定的。通常哈希函数不可能达到O(1)的复杂度,但是哈希函数在字符串哈希的线性的搜索中确实是非常快的,并且通常哈希函数的对象是较小的主键标识符,这样整个过程应该是非常快的,并且在某种程度上是稳定的。
在这篇文章中介绍的哈希函数被称为简单的哈希函数。它们通常用于散列(哈希字符串)数据。它们被用来产生一种在诸如哈希表的关联容器使用的key。这些哈希函数不是密码安全的,很容易通过颠倒和组合不同数据的方式产生完全相同的哈希值。

https://www.cnblogs.com/youngerchina/p/5624453.html

免责声明:文章转载自《hash函数的选择》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NET 环境中使用RabbitMQ以太坊合约简单部署和使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Redis源码解析03: 字典的遍历

  遍历一个稳定的字典,当然不是什么难事,但Redis中的字典因为有rehash的过程,使字典可能扩展,也可能缩小。这就带来了问题,如果在两次遍历中间,字典的结构发生了变化(扩展或缩小),字典中的元素所在的位置相应的会发生变化,那如何保证字典中原有的元素都可以被遍历?又如何能尽可能少的重复迭代呢?   Redis使用的遍历算法非常精妙,使用该算法,可以做到...

OO第一单元总结(多项式求导)

一.综述 第一单元的主题为多项式求导,给定多项式函数,输出其导函数。其中第一次作业仅限幂函数,第二次作业添加了三角函数,第三次作业添加了函数之间的嵌套,相比人人皆知的求导规则,又臭又长,每次都不尽相同的格式要求或许才是真正磨人的地方。 二.作业与BUG分析 第一次作业 1.代码思路 第一次作业总体思路是先用正则拆项,然后根据拆得字符串提取系数与指数构造每一...

Python基础:映射(字典)

一、概述 映射类型(Mapping Types)是一种关联式的容器类型,它存储了对象与对象之间的映射关系。 字典(dict)是Python中唯一的映射类型,它是存储了一个个 键值对(由 键 映射到 值)的关联容器。其中,键(key)必须是可哈希的Python对象,而 值(value)可以是任何Python对象。在功能上,Python中的字典类似于C++中...

暴雪HASH算法(转)

暴雪公司有个经典的字符串的hash公式 先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做? 有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把这样一个程序作出来,但要是有程序员把这样的程序交给用户,我只能用无语来评价,或许它真的能...

Go -- LFU类(缓存淘汰算法)(转)

1.LFU类 1.1.LFU 1.1.1.原理 LFU(LeastFrequentlyUsed)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。 1.1.2.实现 LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。 具体实现如下: 1.新加...

使用 java 创建你的第一个区块链(第一部分)

本系列教程的目的是帮助您了解如何开发区块链技术。 在本教程中,我们将: 创建你的第一个(非常)基本的“区块链”。 实施简单的工作证明(采矿)系统。 惊叹于可能性。 (我假设您对面向对象编程有基本的了解) 需要注意的是,本教程并没有生产区块链的完整功能。相反,这是一个概念实现的证明,以帮助您理解区块链,为以后的教程打基础。 1,安装 教程中使用 Java,...