8个常用的字符串哈希函数

简介: 最有用的两个 unsigned long long hash; // hash使用unsigned long long,超过了unsigned long long就相当于取模//常用11 SDBMHashint SDBMHash(...

最有用的两个

unsigned long long hash; 
// hash使用unsigned long long,超过了unsigned long long就相当于取模
//常用1
1  SDBMHash
int SDBMHash(char *str)
{
    hash = 0;
    while (*str) hash = (*str++) + (hash << 6) + (hash << 16) - hash;
    return hash;
}
//常用2 
int BKDRHash(char *str)
{
    int seed = 131; 
    int hash = 0;
    while (*str) hash = hash * seed + (*str++);
    return hash;
}



常见的8个

const int MAXN = 1000003;

//常用 1
1  SDBMHash
unsigned int SDBMHash(char *str)
{
    unsigned int hash = 0;
    while (*str)
    {
        // equivalent to: hash = 65599*hash + (*str++);
        hash = (*str++) + (hash << 6) + (hash << 16) - hash;
    }
    return (hash & 0x7FFFFFFF)%MAXN;
}
 
2  RS Hash Function
unsigned int RSHash(char *str)
{
    unsigned int b = 378551;
    unsigned int a = 63689;
    unsigned int hash = 0;
 
    while (*str)
    {
        hash = hash * a + (*str++);
        a *= b;
    }
    return (hash & 0x7FFFFFFF)%MAXN;
}
 
3 JS Hash Function
unsigned int JSHash(char *str)
{
    unsigned int hash = 1315423911;
 
    while (*str)
    {
        hash ^= ((hash << 5) + (*str++) + (hash >> 2));
    }
    return (hash & 0x7FFFFFFF)%MAXN;
}
 
4 P. J. Weinberger Hash Function
unsigned int PJWHash(char *str)
{
    unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);
    unsigned int ThreeQuarters    = (unsigned int)((BitsInUnignedInt  * 3) / 4);
    unsigned int OneEighth        = (unsigned int)(BitsInUnignedInt / 8);
    unsigned int HighBits         = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);
    unsigned int hash             = 0;
    unsigned int test             = 0;
    while (*str)
    {
        hash = (hash << OneEighth) + (*str++);
        if ((test = hash & HighBits) != 0)
        {
            hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
        }
    }
    return (hash & 0x7FFFFFFF)%MAXN;
}
 
5 ELF Hash Function
unsigned int ELFHash(char *str)
{
    unsigned int hash = 0;
    unsigned int x    = 0;
    while (*str)
    {
        hash = (hash << 4) + (*str++);
        if ((x = hash & 0xF0000000L) != 0)
        {
            hash ^= (x >> 24);
            hash &= ~x;
        }
    }
    return (hash & 0x7FFFFFFF)%MAXN;
}
 
//常用2 
6 BKDR Hash Function
unsigned int BKDRHash(char *str)
{
    unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
    unsigned int hash = 0;
    while (*str)
    {
        hash = hash * seed + (*str++);
    }
    return (hash & 0x7FFFFFFF)%MAXN;
}
 
7 DJB Hash Function
unsigned int DJBHash(char *str)
{
    unsigned int hash = 5381;
    while (*str)
    {
        hash += (hash << 5) + (*str++);
    }
    return (hash & 0x7FFFFFFF)%MAXN;
}
 
8 AP Hash Function
unsigned int APHash(char *str)
{
    unsigned int hash = 0;
    int i;
    for (i=0; *str; i++)
    {
        if ((i & 1) == 0)
        {
            hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
        }
        else
        {
            hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
        }
    }
    return (hash & 0x7FFFFFFF)%MAXN;
}


目录
相关文章
|
Rust 算法 Go
【密码学】一文读懂FNV Hash
FNV哈希全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出。它可以快速hash大量的数据并保持较小的冲突概率,适合hash一些相近的字符串比如IP地址、URL、文件名等等。目前FNV算法有三个版本,分别是: FNV-0(已废弃)、FNV-1以及FNV-1a。这三个算法的结构非常相似,因此呢,在这里就一块说了。
4030 0
【密码学】一文读懂FNV Hash
|
JavaScript 安全 前端开发
【教程】 Vue混淆加密与还原
Vue是一种流行的JavaScript框架,用于构建用户界面。它简单易用且功能强大,备受开发者喜爱。然而,在传输和存储过程中,我们需要保护Vue代码的安全性。混淆是一种有效的保护措施,可以加密和压缩代码,使其难以被理解和修改。本文将介绍Vue混淆的概念以及如何进行还原。
|
Rust 算法 安全
【密码学】一文读懂MurMurHash2
上次我们聊过了一代的MurMurHash算法,是的,我又来水文章了,今天呢,接着来聊一下二代的MurMurHash算法,二代算法的整体结构实际上和一代算法差不太多,只是对于每一轮数据的处理过程当中的运算有一些差异,算法的来源依然是来自于Google官网给提供的源码,对着源码看的结构,对于这个算法呢,有两个版本,一个是32位的,一个是64位的,对于32位的算法和64位的算法,区别在于两个初始的魔数不同,整体运算过程还是十分相似的。
2733 0
【密码学】一文读懂MurMurHash2
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
181 2
|
Linux iOS开发 MacOS
【MCP教程系列】阿里云百炼MCP全面配置指南:涵盖NPX、UVX、SSE及Streamable HTTP
本文详细介绍如何在阿里云百炼平台及Windows、Linux、MacOS系统中正确配置MCP服务的JSON文件。内容涵盖三种MCP服务配置:npx(基于Stdio)、uvx(Python工具运行)和SSE(服务器发送事件)。同时解析Streamable HTTP作为新一代传输方案的优势与应用,帮助用户掌握每个参数的具体用途及使用方法,解决配置过程中可能遇到的问题,提供完整示例和扩展信息以优化设置体验。
3280 11
|
算法 安全 大数据
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(二)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
441 0
|
机器学习/深度学习 搜索推荐 数据挖掘
深度学习之因果关系建模
基于深度学习的因果关系建模是一项旨在通过深度学习技术识别和理解数据之间因果关系的研究领域。因果关系建模不仅仅关注变量之间的相关性,还希望揭示导致某种结果的根本原因。
487 2
|
机器学习/深度学习 传感器 数据采集
深度学习之自适应机械手操作
基于深度学习的自适应机械手操作,是指通过深度学习技术赋予机械手灵活、智能的控制能力,使其能够适应不同的任务和环境变化,完成复杂的物体抓取、操作和交互。
276 2
|
机器学习/深度学习 存储 搜索推荐
连续迁移学习跨域推荐排序模型在淘宝推荐系统的应用
本文探讨了如何在工业界的连续学习的框架下实现跨域推荐模型,提出了连续迁移学习这一新的跨域推荐范式,利用连续预训练的源域模型的中间层表征结果作为目标域模型的额外知识,设计了一个轻量级的Adapter模块实现跨域知识的迁移,并在有好货推荐排序上取得了显著业务效果。
1263 0
连续迁移学习跨域推荐排序模型在淘宝推荐系统的应用
|
消息中间件 存储 缓存
一文了解清楚kafka消息丢失问题和解决方案
今天分享一下kafka的消息丢失问题,kafka的消息丢失是一个很值得关注的问题,根据消息的重要性,消息丢失的严重性也会进行放大,如何从最大程度上保证消息不丢失,要从生产者,消费者,broker几个端来说。
690 0