字符串哈希

 ###  前置知识

字符串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 ~

练习题

2156. 查找给定哈希值的子串

posted @ 2024-09-20 10:15  r1-12king  阅读(21)  评论(0编辑  收藏  举报