`
kingj
  • 浏览: 425191 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

各种经典的hash算法

 
阅读更多

各种经典hash算法

#include <stdio.h>

#include <iostream>

#include <sstream>

#include <string>

 

using namespace std;

 

class HashLib

{

    public:

        long RSHash(string str)

        {

            int b = 378551;

            int a = 63689;

            long hash = 0;

            for(int i = 0; i < str.length(); i++)

            {

                hash = hash * a + str.c_str()[i];

                a = a * b;

            }

            return hash;

        }

        long JSHash(string str)

        {

            long hash = 1315423911;

            for(int i = 0; i < str.length(); i++)

            {

                hash ^= ((hash << 5) + str.c_str()[i] + (hash >> 2));

            }

            return hash;

        }

        long PJWHash(string str)

        {

            long BitsInUnsignedInt = (long)(4 * 8);

            long ThreeQuarters = (long)((BitsInUnsignedInt * 3) / 4);

            long OneEighth = (long)(BitsInUnsignedInt / 8);

            long HighBits = (long)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth);

            long hash = 0;

            long test = 0;

            for(int i = 0; i < str.length(); i++)

            {

                hash = (hash << OneEighth) + str.c_str()[i];

                if((test = hash & HighBits) != 0)

                {

                    hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));

                }

            }

            return hash;

        }

        long ELFHash(string str)

        {

            long hash = 0;

            long x = 0;

            for(int i = 0; i < str.length(); i++)

            {

                hash = (hash << 4) + str.c_str()[i];

                if((x = hash & 0xF0000000L) != 0)

                {

                    hash ^= (x >> 24);

                }

                hash &= ~x;

            }

            return hash;

        }

        long BKDRHash(string str)

        {

            long seed = 131; // 31 131 1313 13131 131313 etc..

            long hash = 0;

            for(int i = 0; i < str.length(); i++)

            {

                hash = (hash * seed) + str.c_str()[i];

            }

            return hash;

        }

        long SDBMHash(string str)

        {

            long hash = 0;

            for(int i = 0; i < str.length(); i++)

            {

                hash = str.c_str()[i] + (hash << 6) + (hash << 16) - hash;

            }

            return hash;

        }

        long DJBHash(string str)

        {

            long hash = 5381;

            for(int i = 0; i < str.length(); i++)

            {

                hash = ((hash << 5) + hash) + str.c_str()[i];

            }

            return hash;

        }

        long DEKHash(string str)

        {

            long hash = str.length();

            for(int i = 0; i < str.length(); i++)

            {

                hash = ((hash << 5) ^ (hash >> 27)) ^ str.c_str()[i];

            }

            return hash;

        }

        long BPHash(string str)

        {

            long hash = 0;

            for(int i = 0; i < str.length(); i++)

            {

                hash = hash << 7 ^ str.c_str()[i];

            }

            return hash;

        }

        long FNVHash(string str)

        {

            long fnv_prime = 0x811C9DC5;

            long hash = 0;

            for(int i = 0; i < str.length(); i++)

            {

                hash *= fnv_prime;

                hash ^= str.c_str()[i];

            }

            return hash;

        }

        long APHash(string str)

        {

            long hash = 0xAAAAAAAA;

            for(int i = 0; i < str.length(); i++)

            {

                if ((i & 1) == 0)

                {

                    hash ^= ((hash << 7) ^ str.c_str()[i] ^ (hash >> 3));

                }

                else

                {

                    hash ^= (~((hash << 11) ^ str.c_str()[i] ^ (hash >> 5)));

                }

            }

            return hash;

        }

};

 

 

 

int main(int argc, char **argv)

{

    string a = "h";

    HashLib hashlib;

    stringstream tmp;

    for(int i = 0; i < 10 ; i++)

    {

        cout << "----------------------"<< endl;

        tmp << i;

        a = tmp.str();

        cout << a <<  endl; 

        cout << hashlib.JSHash(a) << endl;

        cout << hashlib.RSHash(a) << endl;

        cout << hashlib.PJWHash(a) << endl;

        cout << hashlib.ELFHash(a) << endl;

        cout << hashlib.BKDRHash(a) << endl;

        cout << hashlib.SDBMHash(a) << endl;

        cout << hashlib.DEKHash(a) << endl;

        cout << hashlib.BPHash(a) << endl;

        cout << hashlib.FNVHash(a) << endl;

        cout << hashlib.APHash(a) << endl;

    }

    return 2;

 

}

分享到:
评论

相关推荐

    高运算性能,低碰撞率的hash算法MurmurHash算法.zip

    MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的...

    C语言实现hash算法

    6. 测试:编写测试用例覆盖各种输入情况,包括边缘和异常情况,确保算法的正确性和鲁棒性。 这个项目提供的C语言源码可以作为学习和理解哈希算法的实例,帮助开发者深入理解这些算法的工作原理,并能够在自己的项目...

    20多个常用的Hash算法C++ 实现

    Hash函数集合,包含主流的hash函数: nginx_hash算法,OpenSSL_hash算法,RSHash,JSHash,PJWHash,ELFHash,BKDRHash,DJBHash,DEKHash,APHash等等!

    python版本的各种hash算法

    python版本的各种hash算法

    常用的hash算法(java实现)

    在计算机科学中,哈希(Hash)算法是一种用于将任意长度的数据映射为固定长度输出的函数。这种输出通常称为哈希值或消息摘要。在Java编程语言中,实现哈希算法可以方便地用于数据验证、查找表以及密码存储等多种用途...

    图像的相似度Hash算法(aHash的delphi实现).rar

    在IT领域,Hash算法是一种广泛应用于数据验证、存储和比较的技术。它将任意长度的数据转换成固定长度的输出,通常称为Hash值或指纹。在这个压缩包中,我们重点关注的是图像的相似度Hash算法,特别是平均哈希算法(a...

    Java实现GeoHash算法

    Java实现GeoHash算法是一种在IT领域中用于地理位置数据存储和检索的技术。GeoHash将经纬度坐标转换为字符串,使得地理位置可以被高效地索引和查询。这种算法利用了空间分割和编码策略,使得相邻的位置在编码后具有...

    几种经典的Hash算法的实现(源代码)

    ### 经典Hash算法概述与实现 #### 一、引言 哈希算法在计算机科学领域扮演着极其重要的角色,特别是在数据检索、信息安全以及数据完整性校验等方面。它能够将任意长度的数据转换成一个固定长度的哈希值,这一过程在...

    hash算法工具类

    一个hash算法的工具类,里面包含了一些常用的hash算法

    Hash算法MD5实验报告材料.doc

    "Hash算法MD5实验报告材料" 本实验报告主要介绍了Hash算法MD5的实验报告,旨在通过实际编程来了解MD5算法的加密和解密过程,并加深对Hash算法的认识。 一、Hash算法的定义 Hash算法是一种将输入数据转换为固定...

    geohash算法实现Java代码

    GeoHash算法是一种基于地理坐标的分布式空间索引技术,它通过将地球表面的经纬度坐标转化为可比较的字符串,使得我们可以高效地进行地理位置的搜索、范围查询以及邻居查找等操作。这种算法尤其适用于大数据和分布式...

    hash算法相关介绍

    ### Hash算法相关介绍 在计算机科学领域,哈希(Hash)是一种将任意长度的数据映射为固定长度数据的技术。哈希算法广泛应用于多种场景中,包括但不限于数据完整性验证、密码存储、快速查找等。本文主要介绍了几种...

    geohash算法实现

    Geohash算法实现,经纬度到geohash编码的实现

    hash算法C代码实现

    哈希(Hash)算法在计算机科学中扮演着重要的角色,特别是在数据存储、文件校验、信息安全等领域。本文将深入探讨哈希算法的原理,并提供一个简单的C语言实现示例。 哈希算法,又称为散列函数,是一种将任意长度的...

    Hash算法大全.txt

    ### Hash算法大全 #### 一、引言 Hash算法是一种将任意长度的数据转换为固定长度输出的方法,这种输出通常称为Hash值或Hash码。在计算机科学领域,Hash算法被广泛应用于数据查找、密码存储以及数据完整性校验等多...

    各种hash算法-hashcodeUtil

    《深入理解各种Hash算法与hashCodeUtil》 在计算机科学中,Hash算法扮演着至关重要的角色。它们是一种将任意长度的数据转换为固定长度输出的函数,通常用于数据索引、快速查找、消息摘要等场景。本篇文章将深入探讨...

    hash算法大全.doc

    Universal Hashing 是一种通用的 Hash 算法,它可以用于各种类型的数据。Universal Hashing 算法的实现代码如下: ```java public static int universal(String key) { // 实现 Universal Hashing 算法的代码 } ```...

Global site tag (gtag.js) - Google Analytics