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

字符串哈希

时间:2024-07-26 13:06:35浏览次数:11  
标签:进制 long 131 哈希 字符串 define

进制哈希

BKDRHash哈希函数

字符串哈希:$\color{red}{构造一个数字使之唯一代表一个字符串}$。但是为了将映射关系一一对应,也就是,一个字符串代表一个数字,那么一个数字也对应一个字符串。
我们希望这一个映射是个单射,即保证任意的字符串对应的数字是唯一的,也就是不出现一个数字对应两个字符串等情况。

BKDRHash
BKDRHash是一种“进制哈希”,计算步骤非常简单。设定一个进制\(P\),需要计算一个字符串的哈希值时,把每个字符看作每个进制位上的一个数字,这个串转换为一个基于进制P的数,最后对\(M\)取余数,就得到了这个字符串的哈希值。

注意:
由于得到的哈希值都很大,不能直接映射到一个巨大的空间上,所以一般都需要限制空间。方法是取余,把得到的哈希值对一个设定的空间大小\(M\)取余数,以余数作为索引地址。当然这样做可能产生冲突问题。

编程时可以采用一种隐性取余的方法。取空间大小为\(M=2^{64}\),64是unsigned long long 型的长度,一个unsigned long long型的哈希值\(H\),当\(H>M\)时会自动溢出,等价于自动对\(M\)取余,这样可以避免低效的取余运算。

举例子:
以字符串“abc”为例,令进制\(P=131\),有以下两种方法。
\(1:\)把每个字符看作一个数字,即\(a=1,b=2,c=3....z=26\),然后把字符串的每位按进制\(P\)的权值相加得\('a' *131^2+'b'*131^1+'c'*131^0=17426\)

\(2.:\)把每个字符的ASCII码直接看成代表它的数字也可以,计算得\('a' *131^2+'b'*131^1+'c'*131^0=1677554\)

进制P常用的值有\(31、131、1313、13131、131313\)等,用这些数值可以有效避免碰撞。

模版题P3370 【模板】字符串哈希

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
ull bkdrhash(string s)
{
    ull p=131,h=0;//p为进制数,h为哈希值
    for(int i=0;i<s.size();i++)
    {
        h=h*p+s[i];
    }
    
    return h;
}


void solve()
{
    int n;
    cin>>n;
    set<int>se;
    while(n--)
    {
        string s;
        cin>>s;
        se.insert(bkdrhash(s));
    }
    cout<<se.size();
    
}





signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
}

标签:进制,long,131,哈希,字符串,define
From: https://www.cnblogs.com/swjswjswj/p/18322903

相关文章

  • Python 教程(三):字符串特性大全
    目录专栏列表前言1.字符串基础2.字符串方法字符串查询字符串修改字符串切片3.字符串格式化旧式格式化(`%`操作符)`str.format()`方法f-string(Python3.6+)4.字符串编码5.Unicode和ASCII6.正则表达式7.字符串比较8.字符串连接9.字符串不可变性10.字符串的内......
  • 如何计算两个字符串之间不重叠的字母?
    a=raw_input("Haystack")b=raw_input("Needle")common={}iflen(a)<len(b):forletterina:ifletterinb:common[letter]=1else:forletterinb:ifletterina:common[letter]=1print(len(co......
  • C语言:字符串函数族strlen,strcmp,C语言实现,
    1.字符串的复制:#include<stdio.h>#include<string.h>intmain(intargc,constchar*argv[]){ chararr[20]={0}; charbrr[20]={0}; intlen; inti; printf("请输入目标字符串arr:\n"); gets(arr); printf("请输入源字符串:\n"); gets(brr......
  • 如何在Python中查找字符串中所有出现的子字符串,同时忽略某些字符?
    我想找到所有出现的子字符串,同时忽略某些字符。我怎样才能在Python中做到这一点?示例:long_string='thisisat`es"t.Doesthetestwork?'small_string="test"chars_to_ignore=['"','`']print(find_occurrences(long_string,small_string......
  • 在Python 3中删除两个指定字符串之间的字符串
    我正在从事一个NLP项目,该项目要求我从一段文本中删除计算机代码。代码包含在标签<pre><code>和</code></pre>之间。现在我可以做一个简单的正则表达式匹配,但我想概括这个函数,以便它可以删除任何两个指定字符串之间的文本,即使它们是嵌套的。例如,如果我有一个......
  • 在 matplotlib 中绘制一个字符串函数 // 将 str 解释为 python 代码?
    我正在创建一个RPN计算器,尝试绘制用户给出的函数。例如,如果用户输入"xsin3*plot"我希望它绘制sin(x)*3其代码如下。注意:问题在ifprompt=="plot"userInputX=""#userInputXisalwaysreplacedbefore......
  • 超级强的哈希值生成器
    项目地址:超强哈希生成器https://github.com/nitsc/Strong-Hash-Generator由于网络问题,GitHub的项目上传可能跟不上文章的更新,敬请谅解,谢谢程序介绍SuperStrongHashGenerator(PlusorMini)概述:这个Python程序是一个强大的哈希生成器,它结合了多种哈希算法和加密技术,以......
  • 字符串哈希/双哈希模板
    structHash{usingu64=unsignedlonglong;u64base=13331;vector<u64>pow,hash;Hash(string&s){s=""+s;intN=s.size();pow.resize(N+1),hash.resize(N+1);pow[0]=1,......
  • 字符串探索篇
    leetcode151——反转字符串中的单词题目描述:给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符......
  • 第九天|字符串| 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.
    边写边更中Day9花了我好长时间,由于一道题有好几种方法,感觉今天上午下午都在做Day9,心态有点崩,因为今天还没有时间科研。我决定休息一下,先更到这里。气死我了151.翻转字符串里的单词方法1_fff:定义一个新的字符串str,遍历s,从后往前找到每个单词添加到str中classSolu......