首页 > 其他分享 >字符串哈希

字符串哈希

时间:2024-09-20 10:13:15浏览次数:1  
标签:hash 31 value char 哈希 字符串

 ###  前置知识

字符串hash是指将一个字符串s映射为一个整数,使得该整数尽可能唯一地代表字符串s。
涉及知识:进制转换、秦九韶算法

原理

秦九韶算法原理 对于一个字符串 s,其哈希值可以用以下公式计算:
image

其中:

s_i 表示字符串 s 的第 ( i ) 个字符的 ASCII 值。

p 是一个较大的素数,通常选择为 31 或 128。

m是模数,通常选择为一个较大的素数。

实现步骤

  1. 初始化哈希值 hash_value 为 0。
  2. 遍历字符串的每个字符,依次计算哈希值。
  3. 每次迭代更新哈希值:hash_value = (hash_value * p + char_value) % m

示例代码

假设我们选择 p = 31 和 m = 1000000007(一个常见的大素数),以下是使用秦九韶算法计算字符串哈希值的 Python 代码:

def qinjiushao_hash(s, p=31, m=1000000007):
    hash_value = 0
    for char in s:
        char_value = ord(char)
        hash_value = (hash_value * p + char_value) % m
    return hash_value

# 示例字符串
s = "hello"

# 计算哈希值
hash_value = qinjiushao_hash(s)
print(hash_value)

小技巧

如果将小写字母映射成 1- 26, 可以使用 ascii() & 31

例如,对于字符串s, s[i] & 31:保留字符 s[i] 八位二进制位的后五位。

a ~ z 的 ASCII 码为: 011 00001 ~ 011 11010,保留后五位,即 000 00001 ~ 000 11010,正好是 1 ~ 26

PS:对于 Python 语言,由于 Python 只有字符串类型,没有字符类型,s[i] 表示单个 Unicode 字符的字符串,需要先用内置函数 ord 将其转换为对应 Unicode 码点的整数,即有 ord(s[i]) & 31 ~

标签:hash,31,value,char,哈希,字符串
From: https://www.cnblogs.com/r1-12king/p/18421941

相关文章

  • 截取字符串
    在JavaScript中,截取字符串可以通过多种方法实现,主要包括slice()、substring()和substr()方法。以下是对这些方法的详细说明及示例:使用slice()方法函数说明:slice()方法通过指定的开始和结束位置,提取字符串的某个部分,并以新的字符串返回被提取的部分。注意事项:如果star......
  • java基础练习--字符串之罗马数字转换--两种转换方法
    方法1:查表法//数字-->罗马字符publicstaticStringchangeLuoMa(intnumber){String[]arr={"","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ",};return......
  • 字符串指南
    kmpkmp是模式串匹配的算法,本来最坏时间复杂度可以达到$\operatorname{O}(n\timesm)$,但是kmp可以将复杂度优化到$\operatorname{O}(n+m)$。kmp有个很重要的东西,叫做$nxt$失配数组。比如对于一个字符串$s$,它的失配数组$nxt_n$就是$s$的最大前缀等于后缀的长度。$\op......
  • HJ71 字符串通配符
    HJ71 字符串通配符题目:https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036?tpId=37&tqId=21294&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tag......
  • C和指针:字符串
    字符串、字符和字节字符串基础字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。字符串长度就是字符串中字符数。size_tstrlen(charconst*string);string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。#include......
  • xml字符串转JSON字符串
    xml字符串转JSON字符串,可以直接通过jackson提供的方法进行快速转换。在web项目中通常会引入spring-boot-starter-web依赖。但是spring-boot-starter-web依赖包括Jackson的JSON处理库(如jackson-databind、jackson-core等),不一定直接包含处理XML的Jackson库(如jackson-dataformat-xml......
  • 对象字符串转换为数组对象
    数据源格式:'{\n"填写说明":"每个学期的开学之前,需要调整这里面的配置,这样课表和一卡通对接的才能是正确的数据",\n"学年编号":"2024-2025",\n"学期编号":"1"\n}'"{"填写说明":"每个学期的开学之前,需要调整这里面的配置,这样课表和一卡......
  • 2414.最长的字母序连续字符串的长度
    字母序连续字符串是由字母表中连续字母组成的字符串。换句话说,字符串"abcdefghijklmnopqrstuvwxyz"的任意子字符串都是字母序连续字符串。例如,"abc"是一个字母序连续字符串,而"acb"和"za"不是。给你一个仅由小写英文字母组成的字符串s,返回其最长的字母序连续子字......
  • c++1095: 时间间隔(多实例测试) (字符串和字符以及数字的转换)
    问题描述:题目描述从键盘输入两个时间点(24小时制),输出两个时间点之间的时间间隔,时间间隔用“小时:分钟:秒”表示。要求程序定义如下两个函数,并在main()中调用这两个函数实现相应的功能/*三个形参分别为为用于表示一个时间点的时、分、秒,函数返回对应的秒。*/int HmsToS(int......
  • 查询字符串在数据库哪些表那些列存在/根据字符串快速定位表定位列
    1SETQUOTED_IDENTIFIEROFF2GO3SETANSI_NULLSOFF4GO56IFEXISTS(SELECT*FROMdbo.sysobjectsWHEREid=OBJECT_ID(N'sp_FindString')ANDOBJECTPROPERTY(id,N'IsProcedure')=1)7DROPPROCEDUREsp_FindString8GO......