hash

算法介绍

hash说得通俗一点,就是给一个变量编上一个马甲

比如说一个人聪明可爱,举世无双,天资聪慧.活泼机灵...,那么就是叫我了(真不要脸

但是这样是不是显得些许麻烦?

于是人类发明了名字

比如你叫张三,那么可以理解为张三就是你的hash值,一提到张三就想到你了,编程中也是一样的

比如我给hello_word编上一个序号为233

那么233所对应的值即为hello_word,当然,hello_word对应值也是233

总之,hash就是将一个不常用的东西,用一个常用的东西取代

hash表示

那么hash值怎么确定呢?

首先明确,hash值是想怎么确定就怎么确定的

比如坐标(x,y),hash值可以设置为xy,xy*y,x^y,y^x,x+y......多种多样,但是怎么选择呢?

hash值定义方法:

1.尽量避免冲突

2.方便整洁

hash常用表达方法:折中表示,乘加迭代...

而我们的重点,则是乘加迭代

hash无法逆推

很显然,带mod的hash是无法逆推的,就像k%453==10不能推出k的值一个道理

乘加迭代

对于一串字符串,我们对于每个字符定义一个值(一般为ascll码)

hash[i]=hash[i-1]*k+a[i](把它想象成k进制)

这种方法是不会冲突的,而且也可以推出hash[l][r]=hash[i][r]-hash[i][l-1]*k^(r-l+1)(i<l)

但是hash值往往十分巨大,于是往往会设置一个为一个数取模的值,于是hash值便有了一个范围

但是数是无穷无尽的,根据鸽巢原理,一定会产生冲突

那么我们等像个办法解决它

hash冲突

hash冲突的解决方法也是多种多样的

我们平常一般用拉链法和双hash(常用)

拉链法

假设25631hash值和45698,4521的冲突了,为233

那我们在可以设置一个25631->45698->4521的链表

那么我们查取4521是否出现过

那么就在hash值为233的链表里面查取就是了

双hash

这是一个指标不治本的方法

操作:我们对于两个数是否相同,不再通过一个hash值是否相等来判断,而是通过二个hash值是否相等来判断

那么这就大大降低了hash冲突的可能性

例题

子串查找

思路:

暴力铁定会超时,于是我们想到了hash,只要我们求到子串的值,也就可以判断当前子串是否相等了

考验公式hash(子串l-r)=hash[r]-hash[l-1]*k^(r-l+1)的运用

code:
#include <bits/stdc++.h>
#define ULL unsigned long long
using namespace std;
int ans,len_one,len_two;
ULL k,rec[1000010],p[1000010];
char a[1000010],b[1000010];
int main() {
p[0]=1;
scanf("%s%s",a+1,b+1);
len_one=strlen(b+1);
len_two=strlen(a+1);
for(register int i=1;i<=len_one;i++){
k=k*131+(ULL)(b[i]);
p[i]=p[i-1]*131;
}
for(register int i=1;i<=strlen(a+1);i++)
rec[i]=rec[i-1]*131+(ULL)(a[i]);
for(register int i=len_one;i<=strlen(a+1);i++)
if(rec[i]-rec[i-len_one]*p[len_one]==k)ans++;
printf("%d",ans);
}

图书管理

函数库简单(即hash)的应用

#include<bits/stdc++.h>
using namespace std;
map <string,int>dis;
int main( ){
int n,i,j,k,l,m=0;
char f[10];
string h;
scanf("%d",&n);
while(n--){
scanf("%s",f+1);
getline(cin,h);
if(f[1]=='f'){
if(dis.count(h))printf("yes\n");
else printf("no\n");
}else{
dis[h]=1;
}
}
}

总结

hash公式hash(子串l-r)=hash[r]-hash[l-1]*k^(r-l+1)

hash常用函数库map来表示

浅谈hash的更多相关文章

  1. 浅谈Hash函数

    什么是hash函数: hash函数也可以翻译成“散列”函数,一般就使用音译“哈希”函数,简单的说哈希函数是对任意长度的输入进行的压缩映射,所谓的压缩映射顾名思义,输出通常来说要比输入短,并且得到的输出 ...

  2. 浅谈Hash在多个字符串匹配类型问题中的应用

    在生活中们有时会遇到一些有关字符串匹配的问题. 这时打暴力往往显得很愚蠢,效率低下. 所以就需要一些算法和数据结构来提高效率. Hash Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把 ...

  3. 浅谈HASH长度拓展攻击

    前言 最近在做CTF题的时候遇到这个考点,想起来自己之前在做实验吧的入门CTF题的时候遇到过这个点,当时觉得难如看天书一般,现在回头望去,仔细琢磨一番感觉也不是那么难,这里就写篇文章记录一下自己的学习 ...

  4. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  5. 浅谈字符串Hash

    浅谈字符串Hash 本篇随笔讲解Hash(散列表)的一个重要应用:字符串Hash. 关于Hash Hash是一种数据结构,叫做Hash表(哈希表),也叫散列表.关于Hash的实现,其实与离散化颇为类似 ...

  6. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

  7. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

    本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...

  8. 浅谈HTTPS以及Fiddler抓取HTTPS协议

    最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...

  9. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

随机推荐

  1. Java实现 LeetCode 790 多米诺和托米诺平铺(递推)

    790. 多米诺和托米诺平铺 有两种形状的瓷砖:一种是 2x1 的多米诺形,另一种是形如 "L" 的托米诺形.两种形状都可以旋转. XX <- 多米诺 XX <- &q ...

  2. Java实现 LeetCode 662 二叉树最大宽度(递归)

    662. 二叉树最大宽度 给定一个二叉树,编写一个函数来获取这个树的最大宽度.树的宽度是所有层中的最大宽度.这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空. 每一层的 ...

  3. Java实现 LeetCode 315 计算右侧小于当前元素的个数

    315. 计算右侧小于当前元素的个数 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i ...

  4. Java实现 LeetCode 225 用队列实现栈

    225. 用队列实现栈 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意: 你只能使 ...

  5. Java实现 蓝桥杯VIP 算法提高 质因数2

    算法提高 质因数2 时间限制:1.0s 内存限制:256.0MB 将一个正整数N(1<N<32768)分解质因数,把质因数按从小到大的顺序输出.最后输出质因数的个数. 输入格式 一行,一个 ...

  6. Java培训Day01——制作疫情地图(一)

    一.前言 此次培训,是为期三天的网上培训.最终的目的是制作出疫情地图.首先我们来看看主要的讲课内容大纲. Day1 |-Java语法学习(个人感觉讲得还可以,主要围绕本次培训作出的讲解,没有像网上的基 ...

  7. 大型Electron应用本地数据库技术选型

    开发一个大型Electron的应用,或许需要在客户端存储大量的数据,比如聊天应用或邮件客户端 可选的客户端数据库方案看似很多,但一一对比下来,最优解只有一个 接下来我们就一起来经历一下这个技术选型的过 ...

  8. 如何通过AzureAD平台提供的授权方式访问sharepoint online

    官方文档: 1.https://docs.microsoft.com/zh-cn/previous-versions/azure/dn645543(v=azure.100)?redirectedfro ...

  9. 写了个全局变量的bug,被同事们打脸!!!

    话说栈长前阵子写了一个功能,测试 0 bug 就上线了,上线后也运行好好的,好多天都没有人反馈bug,超爽.. 不出问题还好,出问题就是大问题.. 最近有个客户反馈某些数据混乱问题,看代码死活看不出什 ...

  10. ecshop php商城系统数据库结构及表的介绍分析

      ecshop共86张表,确实比较多,不过功能确实最完善的. 表结构分析 ecs_account_log // 用户账目日志表 ecs_activity // 活动表(代码,名称,开始,结束,描述) ...