变成字符串_字符串哈希:从零开始的十分钟包会教程
大家吼啊!这是我下定决心写专栏以来的第二篇文章,请大家多多资瓷!!同样我们先以上次的话起头吧!
恭喜你找到了这篇博客!虽然这个标题看起来非常像是nc营销号的标题但是!请相信我一次这是真的!如果不行请随时取关!(等等你好像还没关注我那不如现在先关注看完再取关吧哈哈
好了不跟你多BB,想象你现在有一堆数,你要把他们装进一堆桶里,相同的数放在一起,你会怎么做呢?
哦这太简单了!只要在每个桶上面标上这个数,然后把数丢进相应的桶不就完了?
(咦?怎么有个桶看起来就很蠢的样子)
那我们在程序上怎么实现这个桶呢?
啊答主你是没学过数组还是怎么的!直接开一个a[1000],假设来了一个数x,就让a[x]自加1不就行了!
好啊!但你这有个小问题。要是来一个9999怎么办?开a[10000]?
那要是来99999呢?987654321呢?或者更直接,来个字符串呢?
难道要开字符串为下标的数组?这怎么可能呢。
字符串到整数的唯一映射——字符串哈希
让我们想想问题出在哪。下标必须是一个不太大的正整数,也就是说,我们要将一个字符串变成一个不太大的正整数。
首先我们将每个字符看做等于他的ASCII码的整数,这样字符串就变成了一个数串,且每个数不超过127(只有字母和数字的话ASCII是不超过127的)。
现在我们就来突发奇想啦!怎么才能用一个数表示这个数组呢?
从前有这样一种东西,它的每一位都不超过127,也就是说不到128……
啊!这不就是一个128进制的数吗!
从左到右,分别代表了这个128进制数的从高位到低位……
然而我们现在知道的是这个数的每一位,要得到这个数是很简单的。
比如[100,55]这个数有两位,
那么这个数的值就是100×128+55=12855
有三位的话,如[127,100,55],
那就是127×(128^2)+100×128+55=2093623
那么我们只需要提前处理出128的若干次方,然后分别与这个数的每一位相乘,就能得到这个数了!
完美!
等等,128的5次方不就超出int范围了吗?
超就超!
要知道我们实际上要建立的是一个单射关系,即只要能通过一个字符串推出一个唯一确定的数,我们的目的就达到了。
我其实是求出了这个128进制数的值的,只是最后将它映射到了int范围里的数。
这时聪明的读者说:你这样损失了信息,万一两个128进制数本来不同,这么一搞给你搞成相同的了那不完犊子了?
考虑到这个数已经很大了,将它mod一下int范围,其实已经相当于int范围内的随机数了,只是这个数是由字符串唯一确定的。
既然是随机数,那不同的字符串映射到相同数的概率,就跟在0~2147483647里随机取两个数,它们相等的概率一样了。
在实际中,我们可以认为这个概率就是0。
完美!!!
当然,现在这个数的范围是0~2147483647。如果想要继续缩小范围,那么可以再mod一个随便什么数,原理同上。
当然你mod的数也不能太小。具体如果你取N,那么平均情况下在计算到第1.17*√N个字符串时有50%的概率会重复(证明可搜“生日攻击”)。所以建议在不超过限度的情况下尽量取大。
int gethash(char* s, int length, int range) { // 返回的哈希值范围在[0, range) int answer = 0;for(int i = 0; i < length; i++) {answer += s[i] * pow128[i]; // 要提前处理pow128数组 }if(answer < 0) answer = -answer; // 必须是非负数answer %= range;return answer;
}
喜欢的话就支持一下啦,想笔者出什么文章或者有什么建议也可以在评论区说☆
变成字符串_字符串哈希:从零开始的十分钟包会教程相关推荐
- 怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程
大家吼啊!这是我下定决心写专栏以来的第二篇文章,请大家多多资瓷!!同样我们先以上次的话起头吧! 恭喜你找到了这篇博客!虽然这个标题看起来非常像是nc营销号的标题但是!请相信我一次这是真的!如果不行请随 ...
- python十分钟教程_简洁的十分钟Python入门教程
[简介] Python是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. [特点] 1 Python使用C语 ...
- 判断字符串是否为回文字符串_字符串文字
判断字符串是否为回文字符串 String objects hold ordered sequences of bytes, typically characters, usually to form ...
- python做客户端适合吗_太简单!只学十分钟,Python菜鸟也能开发一个区块链客户端...
原标题:太简单!只学十分钟,Python菜鸟也能开发一个区块链客户端 作者:Adil Moujahid 编译:kou.Eli 本文转自区块链大本营(ID:blockchai_camp),转载需授权 区 ...
- 字符内存转成字符串_字符串内存内部
字符内存转成字符串 本文基于我对StackOverflow的回答 . 我正在尝试解释String类如何存储文本,内部存储和常量池如何工作. 这里要理解的要点是String Java对象与其内容– pr ...
- .net mvc actionresult 返回字符串_字符串游戏之无效的身份证
出场人物介绍 小美:小学4年级学生,参加了学校的编程兴趣小组,已经了解了Python语言的基本语法,能够看懂一些简单的程序.她做事风风火火,对所有的事情都很好奇,喜欢打破砂锅问到底,是一个叫人又爱又恨 ...
- 字符串_字符串数组_字符_字符数组
1.字符串 由String类型定义的变量,一个变量代表一个字符串 String str="12345679"; 做题时,遇到输入为一字符串,需要对其进行分割操作时,将字符串各个字符 ...
- char截取字符串_字符串的排列(滑动窗口)
题目: 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: 输入: s1 = "ab" ...
- Net基础篇_学习笔记_第十二天_面向对象继承(字符串_字符串的不可变性)
字符串的特点之一: 字符串的不可变性 1).字符串的不可变性 当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值. 当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向, ...
- 怎样在vs中监视char*字符串_字符串指针数据类型
一.前言 在实际开发中,特别是芯片开发中,例如智能传感器芯片,经常直接使用C语言指针数据类型来操作寄存器.那么字符串指针就是我们常见的操作. C语言没有单独的字符串对象,它是通过数组的形式来表示字符串 ...
最新文章
- tableview插入刷新_iOS中tableview的几种刷新
- http请求响应的组成部分的介绍 用cherome查看请求响应内容 curl命令行的使用
- 看看这些大龄程序员都做了些什么
- 大工13秋《专业英语(计算机英语)》在线测试2,大工13秋《专业英语(计算机英语)》在线测试2答案...
- 关于ES6的Promise
- cli能记日志web不能php,ThinkPHP6.0日志变化
- 微信开发(六):微信卡券
- 练字格子纸模板pdf_十字田字格模板空格40格-练字用书十字格a4打印版下载最新excel版-西西软件下载...
- lombook插件安装
- Android 文件管理器 文件缩略图标显示流程
- ubuntu壁纸1080p
- 网易邮箱实名操作流程
- Scratch软件编程等级考试二级——20210626
- css字体样式渐变导致360浏览器vue兼容性问题
- REW声学测试(二):离线测试
- 腾讯PGC最大规模调整涉及5个VP:“王者荣耀之父”主管 QQ
- Poj 3255(dijkstra求次短路)
- 【人工智能->机器学习->深度学习】
- rpm安装mysql odbc_如何以rpm方式安装mysql odbc驱动
- 密度估计理论(部分)