首页 > 其他分享 >Hash

Hash

时间:2024-05-10 16:01:05浏览次数:24  
标签:取模 hash int long base len Hash

对于一个主串和一个子串,我们想知道它们是否匹配,暴力肯定不可取,如果我们用一个数来表示它们中的每一个字符以及子串呢?字符串hash就出现了
\(f(s)=s[1]*base^{len-1}+s[2]*base^{len-2}+…+s[len]*base^{0}\)

很显然,字符串的hash值的计算是类比于十进制数的个十百位叠加,而不是单纯的字符数值的叠加(例如ab和ba,两个字符串的字符一样,顺序不一样)
那我们就可以去计算一个任意串的hash值了

ull hash(int len){
	ull res=1;
	for(int i=1;i<=len;i++){
		res=(res*base+s[i]);
	}
	return res;
}

这里取值要取模,因为只是去判断数值是否相等,不用比较数值大小,且稍大一点的数会炸int甚至long long,所以要取模
取模方法:
1.自然溢出unsigned long long,这个变量名下的变量不会是负的,对于超出范围的值自动模上\(2^{64}\),这样方便高效,唯一的缺点是很容易被卡
2.单模,找一个大质数去取模,hash值就在0到质数之间
3.双模,找两个质数去取模,如果取模完的值都一样,那么这两个子串就一样

但是求单个的hash值太慢,有时候我们要将一个主串与多个字符串匹配,这个时候,每个子串长度不一,就会T掉,那么我们就要通过前缀和来快速求出主串的hash值
前面提到,hash值的计算是基于类似十进制数的加减,那么我们可以利用这个性质举个栗子:
如果我想让12345与45的值相等,那么我可以让123*\(10^2\),再用12345减去这个值,那么就能和45相等了
类比于字符串:
令\(f_i(s)\)表示f(s[1…i])的哈希值
所以会有\(f_i(s)=s[1]*base^{i-1}+s[2]*base^{i-2}+…+s[i]\)

所以得出
\(f(s[l…r])=f_r(s)-f_{l-1}(s)*base^{r-l+1}\)
对应的图
image

void solve(){
	for(int i=1;i<=len;i++){
		has[i]=has[i-1]*base+c[i];
	}
}
void ba(){
	bas[0]=1;
	for(int i=1;i<=400000;i++){
		bas[i]=bas[i-1]*base;
	}
}
ull check(int from,int to){
	return has[to]-has[from-1]*bas[to-from+1];
}

标签:取模,hash,int,long,base,len,Hash
From: https://www.cnblogs.com/PeppaEvenPigShiGeNiuBDePig/p/18184564

相关文章

  • 【java】【集合类】HashMap 与HashTable的区别
    1.继承的父类不同HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口HashMap继承、实现关系如下: HashTable继承、实现关系如下: Dictionary类是一个已经被废弃的类(见其源码......
  • 模块学习之hashlib模块
    【一】什么是摘要算法Python的hashlib提供了常见的摘要算法,如MD5、SHA1等等摘要算法又称哈希算法、散列算法它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest......
  • [20240426]sql_id 转换hash_value.txt
    [20240426]sql_id转换hash_value.txt--//以前写的脚本,转换sql_idtohash_value.遇到问题:$cats2p.sh#!/bin/bash#convertsql_idtohash_valueodebug=${ODEBUG:-0}sql_id="$*"v1=$(echo$sql_id|tr$(echo{0..9}{a..z}|tr-d'eilo')$(echo{0..9}{a.......
  • Hash
    Hash思想及原理\(\quadHash\)的思想与离散化有些许类似,都是把一个较大的域映射到一个较小的、方便比较的域中,以达到降低时间复杂度的目的。\(\quadHash\)的精髓在于\(Hash\)函数。它并不是一个确定的函数,而是要求各位\(Oier\)自己定义,(怎么定义?想怎么定义就怎么定义)。当处理数......
  • HashCode 为什么使用 31 作为乘数?
    为什么java的hashcode的选用31次方?以下是java源码部分publicinthashCode(){inth=hash;if(h==0&&value.length>0){charval[]=value;for(inti=0;i<value.length;i++){h=31*h+val[i];......
  • 高一下三调|ssy的队列|hash dp|题解
    SSY的队列题目链接解析:考场上看到这个题第一眼是绝望的,毕竟数论咱是一窍不通.但是往下细看了看这个数据范围,N是很小的,就想了想模拟.然而只骗到10分.这个题绩效较高的解法是状压dp,在N<15的范围之内均可薄纱(ppllxx_9G也是成功拿到这70rank1了orz),可得70,但是一到后......
  • 字符串基础(hash,KMP,AC自动机,trie)
    trie树trie树,又叫字典树,就是把字符串的每个字母看做树上的一个节点,若干个字符串组成了一棵trie树。最一般的trie树好像只能搜索字符串,重点是01trie和可持久化trie树和用trie树来建ac自动机(详见AC自动机)。这里着重介绍一下01trie01trie,就是节点代表了数上的二进制位上的数。......
  • windows密码存储以及hashdump所得信息解析
    1.windows登录的明文密码,存储过程是怎么样的,密文存在哪个文件下,该文件是否可以打开,并且查看到密文在Windows中密码通常不会以明文形式存储。系统会通过保存密码的哈希值来确保安全性。这个过程涉及到NTLM或Kerberos身份认证协议,它们负责加密存储密码。以下是存储过程的简要说......
  • Hashtable和ConcurrentHashMap如何实现线程安全
    感谢一起重温此知识点的同学--糖糖HashMap线程不安全,效率高put方法没有锁//任意地方声明HashMap,点击put即可进入源码HashMap<String,String>hashMap=newHashMap();hashMap.put("heart","糖糖");//HashMap.put(key,value)部分源码publicVput(Kkey,Vvalue){......
  • hash hash hash : ))
    hash:hash简述,大概就是把一个字符串映射到一个整数上(这个整数就是一个自定义进制(mode)的数),通过比较该整数匹配字符串,这样可以实现字符串之间的O(1)匹配.为什么要按位处理,因为这样方便分离字串.怎么映射?就是将每位(i)分离乘上\(mode^{(i-1)}\),得到的映射整型就是这个字......