当前位置: 首页 > news >正文

字符串之Hash

字符串之Hash

0x01 进制Hash`

众所众知我们比较字符串是需要 \(\mathcal{O}(len)\) 的时间,但数字只需要 \(\mathcal{O}(1)\) 即可比较。所以有没有方法可以吧字符串变成数字呢?

肯定有啊!那就是进制Hash了。啥是进制Hash呢?进制Hash顾名思义就是吧字符串看成 \(b\) 进制数。\(b\) 一般为 \(131,13131\)

进制Hash有两种实现:

  1. 左为低位,右为高位

code:

int gethash(string s){int hash=0;for(int i=0,b=1;i<len;i++,b*=B){hash+=s[i]*b;}return hash;
}
  1. 左为高位,右为低位

code:

int gethash(string s){int hash=0;for(int i=0;i<len;i++){hash=hash*B+s[i];}return hash;
}

本文以f2为例。

0x02模数

当然,这个数肯定会超long long所以我们一般还要模上一个 \(p\)\(p\) 一般为 \(998244353,10^9+7,10^9+9\) 或用unsigned long long(等于模 \(2^46\))。因为某些原因请将 \(p\) 设为质数。

所以完整的code为

code:

int gethash(string s){int hash=0;for(int i=0;i<len;i++){hash=((hash*B)%P+s[i])%P;}return hash;
}

0x03 生日攻击

但是,这样可能会有两个不同的字符串Hash值相同这叫Hash冲突。那这个概率有多少呢?我们先开康康这个问题吧!

一个班上有 \(50\) 人,那没有两个人生日相同的概率为多少?(假定没有闰年,且每天出生的概率相同)

可以先自己想一想哦~

这是一个古典模型根据公式:\(P(A)=\frac{A}{N}\) 可以算出概率为 \(\frac{P^{50}_{365}}{2^{365}}<3%\)

这时有个结论,Hash冲突的概率为 \(e^{-\frac{n(n-1)}{2p}}\)

0x04 解决办法

那就是用大大大大模数或者用双Hash,也就是用不同的 \((b,p)\) 算出来的都一样就当相同。

0x05 截取&拼接

(此章以f2为例)

假设 \(S\) 的Hash为 \(H(s)\)\(t\) 的Hash为 \(H(t)\)

那显然 \(H(s+t)=b^{len_t}H(s)+H(t)\)

那拆分呢?对用前缀和。

我们可以从 \(H(s+t)=b^{len_t}H(s)+H(t)\) 得到 \(H(0...r)=b^{len_t}H(0...l-1)+H(l...r)\) 变形得 \(H(l..r)=H(0...r)-b^{r-l+1}H(0...l)\)

http://www.jsqmd.com/news/913032/

相关文章:

  • 第21篇|侧边导航:平板和 2in1 为什么不照搬手机布局
  • 保姆级教程:用Matlab/Simulink+CarSim复现平行泊车仿真(附模型文件与避坑点)
  • CSS Transitions 过渡效果详解
  • 抖音音频提取革命:3分钟搞定批量下载的开源神器
  • Claude生成代码质量究竟如何?37项实测指标揭穿90%开发者忽略的隐藏风险
  • C++跨平台开发:微信聊天记录导出工具架构解析与实现
  • 【雷达干扰】FMCW 雷达稀疏低秩 Hankel 矩阵分解的干扰抑制附Matlab代码
  • 2026年近期,如何选择行业知名的液压马达定制厂家? - 2026年企业资讯
  • 挖坑指南:为什么你的数据采集卡老是“丢帧”?一篇文章讲透Flash、FRAM、PSRAM的区别与实战
  • 三步轻松复活经典游戏联机:IPXWrapper让老游戏重获新生
  • 别再瞎测了!用IxChariot给工业网关做吞吐量测试,这5个坑我帮你踩过了
  • 隐形冠军舜展智能:16年磨一剑,用等离子技术点亮中国高端制造
  • 第19篇|沉浸式首页:地图、玻璃层、信息卡片的层级关系
  • 制造业AI智能体选型:跨系统执行、任务拆解与信创适配三大技术维度对比
  • Photoshop AVIF插件深度探索:为什么这款开源神器正在改变图像处理工作流?
  • 从Windows转战Ubuntu?手把手教你无缝迁移Beyond Compare使用习惯(含dpkg安装与破解详解)
  • 16位ADC不够用?别急着换芯片!教你用“过采样+滑动平均”榨出24位极致精度
  • 别再重装系统了!LightDM报错‘Failed to Start’的5种修复方案与深度解析
  • Flutter Hero Animation 详解
  • 2026年Q2北京铝合金回收:北京溴化锂机组回收/北京电器回收/北京电子设备回收/北京电池回收/北京电线电缆回收/选择指南 - 优质品牌商家
  • 从MODBUS协议栈到你的代码:深入理解CRC-16校验的‘位反序’到底在干什么?
  • 高性能语音合成部署:基于Sherpa-Onnx的MeloTTS多语言模型转换与优化方案
  • 文泉驿微米黑终极安装指南:5MB轻量级中文字体跨平台快速部署
  • 【图像提取】基于数学形态学的数字视网膜图像血管提取 (DRIVE) 数据集分割附Matlab代码
  • 【AI搜索革命性差异指南】:3大核心维度拆解AI搜索与传统搜索的底层逻辑差异
  • 别只用来聊天!解锁BitoAI在VSCode中的5个高效编程场景(含代码规范检查与性能优化)
  • FastAdmin后台开发实战:手把手教你从零新增一个自定义管理页面(ThinkPHP6框架)
  • Simulink封装模块的‘隐藏关卡’:初始化命令与回调函数实战指南(避坑+案例)
  • 深入Windows消息循环:手把手教你用Unity拦截WM_SIZING实现自定义窗口控制
  • 【绿化】Fong投屏 一键手机投屏 多设备兼容超稳定