哈希函数

数据结构之哈希表(散列表)

别等时光非礼了梦想. 提交于 2019-12-02 06:51:34
哈希表 是唯一一个专用于集合的数据结构。可以以常量的平均时间实现插入,删除和查找 哈希表的时间复杂度是 O(1) 哈希表的思想是 用一个与集合差不多大小的数组来存储这个集合,将数据元素的关键字映射的数组的下标上面,这个映射我们称之为 散列函数 数组称之为 散列表,查找数据的时候,根据被查找的关键字找到存储数据元素的地址,从而获取元素 散列函数的应用带来一个比较复杂的问题:; 因为散列函数的定义域范围比值域大 导致2个或者更多的数据元素可能会被映射到同一个位置 称为 冲突或者碰撞。这种情况是不可避免的。因此 实现哈希表 二个基本的问题是 1如何设计散列函数 2如何解决碰撞问题 来源: https://www.cnblogs.com/burg-xun/p/11735360.html

关于==、equals和hashCode详解

青春壹個敷衍的年華 提交于 2019-12-02 06:32:57
这几天在尝试手撸一个类似Lombok的注解式代码生成工具,用过Lombok的小伙伴知道,Lombok可以通过注解自动帮我们生产equals()和hashCode()方法,因此我也想实现这个功能,但是随着工作的深入,我发现其实自己对于equals()和hashCode()的理解,也处在一个很低级的阶段。 因此痛定思痛,进行了一番深入学习,才敢来写这篇博客。 文章目录 1、equals在Java中含义 2、hashCode在Java中的作用 3、为什么hashCode和equals要一起重写 4、扩展:实现科学的哈希函数 1、equals在Java中含义 首先要解释清楚这个,equals方法在Java中代表逻辑上的相等,什么叫逻辑上的相等?这个就涉及到Java本身的语法特性。 我们知道,Java中存在着==来判断基本数据类型的相等,但是对于对象,==只能判断内存地址是否相等,也就是说是否是同一个对象: int a = 10000; int b = 10000; // 对于基本数据类型, == 可以判断逻辑上的相等 System.out.println(a == b); Integer objA = 10000; Integer objB = 10000; Integer objA1 = objA; // 对于类实例, == 只能判断是否为同一个实例(可以视为内存地址是否相等)

密码技术之认证

人走茶凉 提交于 2019-12-02 03:11:11
第二部分:认证   当比较两条消息是否一致时,我们不必直接对比消息本身的内容,只要对比它们的“指纹”就行了。   一、单向散列函数(one-way hash function)     单向散列函数也称为消息摘要函数(message digest function)、哈希函数或者杂凑函数。     单向散列函数有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash value)也称为消息摘要(message digest)或者指纹。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。所谓完整性是指有没有被篡改,或称为一致性。     这里的消息可以是文字,图片或者文件等。并且散列值的长度和消息的长度无关,无论消息的大小是多少,散列函数都会计算出固定长度的散列值。如SHA-256单向散列函数,它计算出的长度永远 是256bit。   单项散列函数的性质   (1)、根据任意长度的消息计算出固定长度的散列值   (2)、能够快速计算出散列值   (3)、消息不同,散列值也不相同(哪怕1bit,散列值也不同),难以发现碰撞的性质称为抗碰撞性,密码技术中所使用的单向单列函数,都具备抗碰撞性。也就是说难以找到两条消息的散列值相同。   (4)、具备单向性,指无法通过散列值反算出消息的性质。破镜不能重圆   单项散列函数的实际应用  

[转载]布隆过滤器(Bloom Filter)

余生颓废 提交于 2019-12-01 20:41:49
[转载]布隆过滤器(Bloom Filter) 这部分学习资料来源: https://www.youtube.com/watch?v=v7AzUcZ4XA4 Filter判断不在,那就是肯定不在;Filter判断在,那只能说有一定几率在 有点乱啊,意思就是: 布隆过滤器会倾向于判断在 ,这就是它的误差:它把可能不在的都说成是在。 用一个函数将元素映射到一个二进制数组中。当需要插入时,将插入元素映射为二进制位,如果数组中有至少对应的一个位不是1,就说明不在。 一个更完整的例子: 误差就是B!B本来不存在,但是判断就是存在了,所以就是判断失误了:它会将一些本来不存在的情况判断为存在。 正是因为这个误识别率,所以它被称为Filer,也就是“过滤器”,它的过滤效果不是100%的。 使用案例: 比特币网络: PS,我个人是不相信区块链的,详见https://www.zhihu.com/question/43572793里大佬有理有据的解释,这里就是个例子 附上各个节点的含义: SPV节点:快速判断是否有交易记录,说没有就是没有,用以提升效率 如果判断说存在,再去响应的区块中查。 来源: https://zhuanlan.zhihu.com/p/43263751 布隆过滤器数据结构 布隆过滤器是一个 bit 向量或者说 bit 数组 ,长这样: 如果我们要映射一个值到布隆过滤器中,我们需要

SGI-STL简记(八)-哈希关联容器(hash、hash_set、hash_map、hash_multiset、hash_multimap)

て烟熏妆下的殇ゞ 提交于 2019-12-01 02:04:48
stl_hash_fun.h : hash:模板函数对象类类型,一般作为hash_set、hash_map、hash_multiset、hash_multimap容器的默认哈希函数,目前提供了多个特化版本,并重载实现operator(),参数类型有char、unsigned char、char*、int等 内置可转化为整型的数据类型的版本;除const char*和char*使用了__stl_hash_string计算哈希值,其余的则直接返回参数value值作为哈希值;哈希值返回值类型为size_t; __stl_hash_string:遍历各个字符串元素,累积遍历计算哈希值,计算方式为h=0;h=5*h+*s,*s为遍历字符串相应元素,h即为最后的哈希值,类型为unsigned long; 对于其他的hash模板实例实现,如basic_string<_CharT,_Traits,_Alloc>、crope、wrope或者是用户自定义的hash模板函数对象实现; stl_hashtable.h : _Hashtable_node:哈希表节点模板类; 数据成员: _M_next:指向下一个哈希表节点的指针; _M_val:保存当前哈希表节点的值(哈希值); _Hashtable_iterator/_Hashtable_const_iterator:哈希表迭代器模板类,模板参数_Val

【数据结构】Hash表

寵の児 提交于 2019-11-30 06:18:15
【数据结构】Hash表 Hash表也叫散列表,是一种线性数据结构。在一般情况下,可以用o(1)的时间复杂度进行数据的增删改查。在Java开发语言中,HashMap的底层就是一个散列表。 1. 什么是Hash表 Hash表是一种线性数据结构,这种数据结构的底层一般是通过数组来实现的。在进行数据增删改查的时候,Hash表首先通过Hash函数对某个键值进行Hash操作,这个Hash操作会将这个键映射到数组的某个下标,获得下标以后就可以直接对数组中的数据进行操作了。理论上讲,Hash表数据操作的时间复杂度都是O(1)。 Hash表的底层是通过数组实现的。数据有个特点就是:必须在初始化的时候指定其长度。所以当Hash表中的数据填满之后想继续向里面放数据的话就必须再创建一个容量更大的数组,然后将之前数组中的数组copy到这个新数组中。这个过程是一个耗费性能的操作,因此我们在使用Hash表之前最好估算下数据的容量,尽量避免扩容操作。 2. Hash函数 哈希函数又称为散列函数,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。假设输出值域为S,哈希函数的性质如下: 典型的哈希函数都有无限的输入值域;

day07

泪湿孤枕 提交于 2019-11-29 18:59:08
Python深浅拷贝 拷贝(赋值)、浅拷贝、深拷贝 可变or不可变:d不变值可变,即在原值的基础上修改,则为可变数据类型;值变id也变,即重新申请一个空间放入新值,则为不可变数据类型。 拷贝 如果l2是l1的拷贝对象,则l1内部的任何数据类型的元素变化,则l2内部的元素也会跟着改变,因为可变类型值变id不变。 浅拷贝 如果l2是l1的浅拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,则l2会跟着改变。 深拷贝 如果l2是l1的深拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,l2也不会变,即l2永远不会因为l1的变化而变化。 哈希表 ​ 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 ​ 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 基本概念 若关键字为 k ,则其值存放在 f(k) 的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系 f 为散列函数,按这个思想建立的表为散列表。

哈希(散列)详解

半城伤御伤魂 提交于 2019-11-28 16:08:35
散列表(也叫哈希表),是根据关键字值而直接进行访问的数据结构。 通过把关键字值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 散列函数的构造方法: (1)直接定址法 (2)除留余数法 (3)平方取中法 (4)折叠法 (5)数值分析法 本文采用除留余数法构造散列函数。 H(K) = (H(k) + i) % m; 其中i = 1, 2, …, m为哈希表大小。 构造散列函数的目的是减少冲突,但要完全避免冲突是不可能的,只能尽可能减少冲突。 处理冲突的方法: (1)开放定址法 (2)二次探测法 (3)链地址法(拉链法) 开放地址法: 线性探查法:H(K) = (H(k) + i) %d 每次+1,一次循环查找。缺点:容易造成聚集现象 平法探查法:H(K) = (H(k) + ) %d 每次加 ,避免了线性探查的聚集现象,缺点:不能探查到散列表的所有单元,但知道可以探查到散列表的一半单元。 根据原始数组建立一个哈希表,哈希表也为一个数组,且要求哈希表有固定大小。 本文采用 开放定址法处理冲突 ,线性探查法。 当由H(k)算出的位置不为空时,则通过已经构造的散列函数来寻找新的空位置。 从H(k)开始往后逐个搜索空位置,如果后面没有空位置,则从头开始搜索,直到搜索到空位置,或者回到H(k)停止搜索。(回到H(k)则说明搜索失败) 举例

(转载)图像检索:基于内容的图像检索技术

Deadly 提交于 2019-11-28 12:28:21
图像检索:基于内容的图像检索技术 背景与意义 在Web2.0时代,尤其是随着Flickr、Facebook等社交网站的流行,图像、视频、音频、文本等异构数据每天都在以惊人的速度增长。例如, Facebook注册用户超过10亿,每月上传超过10亿的图片;Flickr图片社交网站2015年用户上传图片数目达 7.28亿 ,平均每天用户上传约200万的图片;中国最大的电子商务系统淘宝网的后端系统上保存着286亿多张图片。针对这些包含丰富视觉信息的海量图片,如何在这些浩瀚的图像库中方便、快速、准确地查询并检索到用户所需的或感兴趣的图像,成为多媒体信息检索领域研究的热点。基于内容的图像检索方法充分发挥了计算机长于处理重复任务的优势,将人们从需要耗费大量人力、物力和财力的人工标注中解放出来。经过十来来的发展,基于内容的图像检索技术已广泛应用于搜索引擎、电子商务、医学、纺织业、皮革业等生活的方方面面。 图像检索按描述图像内容方式的不同可以分为两类,一类是基于文本的图像检索(TBIR, Text Based Image Retrieval),另一类是基于内容的图像检索(CBIR, Content Based Image Retrieval)。 基于文本的图像检索方法始于上世纪70年代,它利用文本标注的方式对图像中的内容进行描述,从而为每幅图像形成描述这幅图像内容的关键词,比如图像中的物体、场景等

程序员,你应该知道的数据结构之哈希表

我怕爱的太早我们不能终老 提交于 2019-11-28 06:28:31
哈希表简介 哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1),因为哈希表的查找速度非常快,所以在很多程序中都有使用哈希表,例如拼音检查器。 哈希表也有自己的缺点,哈希表是基于数组的,我们知道数组创建后扩容成本比较高,所以当哈希表被填满时,性能下降的比较严重。 哈希表采用的是一种转换思想,其中一个中要的概念是如何将 键 或者 关键字 转换成数组下标?在哈希表中,这个过程有哈希函数来完成,但是并不是每个 键 或者 关键字 都需要通过哈希函数来将其转换成数组下标,有些 键 或者 关键字 可以直接作为数组的下标。我们先来通过一个例子来理解这句话。 我们上学的时候,大家都会有一个学号 1-n号 中的一个号码,如果我们用哈希表来存放班级里面学生信息的话,我们利用学号作为 键 或者 关键字 ,这个 键 或者 关键字 就可以直接作为数据的下标,不需要通过哈希函数进行转化。如果我们需要安装学生姓名作为 键 或者 关键字 ,这时候我们就需要哈希函数来帮我们转换成数组的下标。 哈希函数 哈希函数的作用是帮我们把非int的 键 或者 关键字 转化成int,可以用来做数组的下标。比如我们上面说的将学生的姓名作为 键 或者 关键字 ,这是就需要哈希函数来完成,下图是哈希函数的转换示意图。 哈希函数的写法有很多中