大家吼啊!这是我下定决心写专栏以来的第二篇文章,请大家多多资瓷!!同样我们先以上次的话起头吧!

恭喜你找到了这篇博客!虽然这个标题看起来非常像是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;
}

喜欢的话就支持一下啦,想笔者出什么文章或者有什么建议也可以在评论区说☆

变成字符串_字符串哈希:从零开始的十分钟包会教程相关推荐

  1. 怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程

    大家吼啊!这是我下定决心写专栏以来的第二篇文章,请大家多多资瓷!!同样我们先以上次的话起头吧! 恭喜你找到了这篇博客!虽然这个标题看起来非常像是nc营销号的标题但是!请相信我一次这是真的!如果不行请随 ...

  2. python十分钟教程_简洁的十分钟Python入门教程

    [简介] Python是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. [特点] 1 Python使用C语 ...

  3. 判断字符串是否为回文字符串_字符串文字

    判断字符串是否为回文字符串 String objects hold ordered sequences of bytes, typically characters, usually to form ...

  4. python做客户端适合吗_太简单!只学十分钟,Python菜鸟也能开发一个区块链客户端...

    原标题:太简单!只学十分钟,Python菜鸟也能开发一个区块链客户端 作者:Adil Moujahid 编译:kou.Eli 本文转自区块链大本营(ID:blockchai_camp),转载需授权 区 ...

  5. 字符内存转成字符串_字符串内存内部

    字符内存转成字符串 本文基于我对StackOverflow的回答 . 我正在尝试解释String类如何存储文本,内部存储和常量池如何工作. 这里要理解的要点是String Java对象与其内容– pr ...

  6. .net mvc actionresult 返回字符串_字符串游戏之无效的身份证

    出场人物介绍 小美:小学4年级学生,参加了学校的编程兴趣小组,已经了解了Python语言的基本语法,能够看懂一些简单的程序.她做事风风火火,对所有的事情都很好奇,喜欢打破砂锅问到底,是一个叫人又爱又恨 ...

  7. 字符串_字符串数组_字符_字符数组

    1.字符串 由String类型定义的变量,一个变量代表一个字符串 String str="12345679"; 做题时,遇到输入为一字符串,需要对其进行分割操作时,将字符串各个字符 ...

  8. char截取字符串_字符串的排列(滑动窗口)

    题目: 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: 输入: s1 = "ab" ...

  9. Net基础篇_学习笔记_第十二天_面向对象继承(字符串_字符串的不可变性)

    字符串的特点之一: 字符串的不可变性 1).字符串的不可变性 当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值. 当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向, ...

  10. 怎样在vs中监视char*字符串_字符串指针数据类型

    一.前言 在实际开发中,特别是芯片开发中,例如智能传感器芯片,经常直接使用C语言指针数据类型来操作寄存器.那么字符串指针就是我们常见的操作. C语言没有单独的字符串对象,它是通过数组的形式来表示字符串 ...

最新文章

  1. tableview插入刷新_iOS中tableview的几种刷新
  2. http请求响应的组成部分的介绍 用cherome查看请求响应内容 curl命令行的使用
  3. 看看这些大龄程序员都做了些什么
  4. 大工13秋《专业英语(计算机英语)》在线测试2,大工13秋《专业英语(计算机英语)》在线测试2答案...
  5. 关于ES6的Promise
  6. cli能记日志web不能php,ThinkPHP6.0日志变化
  7. 微信开发(六):微信卡券
  8. 练字格子纸模板pdf_十字田字格模板空格40格-练字用书十字格a4打印版下载最新excel版-西西软件下载...
  9. lombook插件安装
  10. Android 文件管理器 文件缩略图标显示流程
  11. ubuntu壁纸1080p
  12. 网易邮箱实名操作流程
  13. Scratch软件编程等级考试二级——20210626
  14. css字体样式渐变导致360浏览器vue兼容性问题
  15. REW声学测试(二):离线测试
  16. 腾讯PGC最大规模调整涉及5个VP:“王者荣耀之父”主管 QQ
  17. Poj 3255(dijkstra求次短路)
  18. 【人工智能->机器学习->深度学习】
  19. rpm安装mysql odbc_如何以rpm方式安装mysql odbc驱动
  20. 密度估计理论(部分)

热门文章

  1. WinForm中显示韩语,韩文
  2. 分布式框架的基石之远程通信协议
  3. Dubbo限流方式源码阅读
  4. 【Spring-tx】ProxyTransactionManagementConfiguration类
  5. RabbitMQ消息幂等性之全局唯一ID
  6. Linux之常用操作命令总结二
  7. MyBatis中Mapper接口是怎么和XML文件关联起来的
  8. JQuery控制div外点击隐藏,div内点击不会隐藏
  9. ELK收集tomcat访问日志并存取mysql数据库案例
  10. 【BIEE】14_开发流程介绍