首页 > 其他分享 >哈希

哈希

时间:2024-07-27 16:39:39浏览次数:9  
标签:Hash times base 哈希 mathtt sim

哈希是将一个序列映射到一段整数区间的函数。

通常要求对于两个随机的等长的不同序列,哈希函数得到的值(以下简称 Hash 值)不同。

更概括地说,Hash 函数满足:

  1. 序列相同时,Hash 值一定相同
  2. 序列不同时,Hash 值大概率不同;若两个长度相等的不同字符串 Hash 值相同,我们称这是“哈希碰撞”。

实现

考虑各种原因,OI 上使用的哈希函数通常这样实现:

对于字符串 \(S\),记其前缀 \(S_{1\sim i}\) 的哈希值为 \(H_i\)。形式上记 \(H_0=0\),则

\[H_i=H_{i-1}\times\mathtt{base}+S_{i} \]

或者,有封闭形式:

\[H_{i}=\sum_{j=1}^{i}S_{j}\times\mathtt{base}^{i-j} \]

容易发现,实际上是将序列视为一个以 \(\mathtt{base}\) 为进制的数。

为了控制值域,一般对一个大质数取模,或者让它自然溢出。

OI 界普遍认为取 \(\mathtt{base}\) 为 \(131\) 或 \(13331\) 难以在随机数据下发生哈希碰撞。

但是对着你的程序总是能构造数据卡掉你,见工具 anti-hash

快速求子串哈希值

对于比对两个序列的子串的情形,我们可以预处理哈希值做到单次 \(O(1)\)。

参考定义,容易发现:

\[H_{i\sim j}=H_j-H_i\times\mathtt{base}^{j-i+1} \]

预处理序列的前缀哈希值和 \(\mathtt{base}\) 的幂即可。

二维哈希

随便思考一个哈希方法是容易的,难点在如何快速求子矩阵的 Hash 值。

具体来说,对于矩阵 \(A\),二维哈希的前缀矩阵定义为:

\[\begin{aligned} I_{i,j}&=\sum_{k=1}^{i}\left(\sum_{t=1}^{j}A_{k,j}\times\mathtt{base_1}^{j-t}\right)\times\mathtt{base_2}^{i-k}\\ &=\sum_{k=1}^{i}\sum_{t=1}^{j}A_{k,j}\times\mathtt{base_1}^{j-t}\times\mathtt{base_2}^{i-k} \end{aligned} \]

则其子矩阵 \(A_{a\sim b,c\sim d}\) 的哈希值为

\[I_{a\sim b,c\sim d}=I_{b,d}-I_{b,c}\times\mathtt{base_1}^{c-d+1}-I_{a,d}\times\mathtt{base_2}^{b-a+1}+I_{a,c}\times\mathtt{base_1}^{c-d+1}\mathtt{base_2}^{b-a+1} \]

标签:Hash,times,base,哈希,mathtt,sim
From: https://www.cnblogs.com/weily09/p/18327041/strHash

相关文章

  • 字符串哈希
    进制哈希BKDRHash哈希函数字符串哈希:$\color{red}{构造一个数字使之唯一代表一个字符串}$。但是为了将映射关系一一对应,也就是,一个字符串代表一个数字,那么一个数字也对应一个字符串。我们希望这一个映射是个单射,即保证任意的字符串对应的数字是唯一的,也就是不出现一个数字对应......
  • 超级强的哈希值生成器
    项目地址:超强哈希生成器https://github.com/nitsc/Strong-Hash-Generator由于网络问题,GitHub的项目上传可能跟不上文章的更新,敬请谅解,谢谢程序介绍SuperStrongHashGenerator(PlusorMini)概述:这个Python程序是一个强大的哈希生成器,它结合了多种哈希算法和加密技术,以......
  • 字符串哈希/双哈希模板
    structHash{usingu64=unsignedlonglong;u64base=13331;vector<u64>pow,hash;Hash(string&s){s=""+s;intN=s.size();pow.resize(N+1),hash.resize(N+1);pow[0]=1,......
  • 字符串哈希
    首先对于知识点会在8月份更新,目前只是单纯的对一道题进行展示题目链接https://ac.nowcoder.com/acm/contest/87255/E题意:题目要求我们找出两个等长的字符串a和b中的“好”字符数量。一个字符被称为“好”字符,如果它在字符串a和b的所有循环同构字符串中出现的位置......
  • C++| STL之unordered_map(哈希表)和map
    前言:Leetcode题目中有一个哈希表的专题,自己实现的话没必要,可以直接用STL现成的unordered_map函数,提到unordered_map就不得不提到map,于是有了此篇相关知识点的汇总。unordered_map和mapkey和valueunordered_map使用map原理对比unordered_map使用对比unordered_mapke......
  • 存在重复元素 II-哈希表
    题目描述:个人题解:从左到右遍历数组nums,当遍历到下标i时,如果存在下标j<i使得nums[i]=nums[j],则当i−j≤k时即找到了两个符合要求的下标j和i。如果在下标i之前存在多个元素都和nums[i]相等,为了判断是否存在满足nums[i]=nums[j]且i−j≤k的下标j,应该在这......
  • 在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的
    哈希表(散列表)的工作原理哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过哈希函数将输入的键(key)映射到表中的一个位置(即索引或槽位),从而以接近常数时间复杂度进行查找、插入和删除操作。哈希表的基本工作流程如下:哈希函数:哈希函数接受一个输入(键),并......
  • 算法笔记|Day6哈希表基础II
    算法笔记|Day6哈希表基础II☆☆☆☆☆leetcode454.四数相加II题目分析代码☆☆☆☆☆leetcode383.赎金信题目分析代码☆☆☆☆☆leetcode15.三数之和题目分析代码☆☆☆☆☆leetcode18.四数之和题目分析代码☆☆☆☆☆leetcode454.四数相加II题目链接:leetco......
  • 数据结构(Java):Map集合&Set集合&哈希表
    目录1、介绍1.1 Map和Set1.2模型2、Map集合2.1Map集合说明2.2 Map.Entry<K,V>2.3Map常用方法2.4Map注意事项及实现类 3、Set集合3.1Set集合说明 3.2 Set常用方法 3.3Set注意事项及其实现类4、TreeMap&TreeSet4.1集合类TreeMap(Key-Value模型)4.1.1底......
  • 代码随想录哈希表第二天:四数相加2、三数之和、四数之和、赎金信
    详细可移步个人代码随想录打卡四数相加使用2次,2层for循环。即可确定和值,然后使用一个map来记录第一个for循环的值,再第二次for循环中找,并记录次数即可。代码如下:importjava.util.HashMap;importjava.util.Map;classSolution{publicintfourSumCount(int[]n......