字符串哈希
###  前置知识
字符串hash是指将一个字符串s映射为一个整数,使得该整数尽可能唯一地代表字符串s。
涉及知识:进制转换、秦九韶算法。
原理
秦九韶算法原理 对于一个字符串 s,其哈希值可以用以下公式计算:
其中:
s_i 表示字符串 s 的第 ( i ) 个字符的 ASCII 值。
p 是一个较大的素数,通常选择为 31 或 128。
m是模数,通常选择为一个较大的素数。
实现步骤
- 初始化哈希值 hash_value 为 0。
- 遍历字符串的每个字符,依次计算哈希值。
- 每次迭代更新哈希值: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
~