常用Hash算法(C语言的简单实现)

如下所示:

#include "GeneralHashFunctions.h" 

unsigned int RSHash(char* str, unsigned int len)
{
  unsigned int b  = 378551;
  unsigned int a  = 63689;
  unsigned int hash = 0;
  unsigned int i  = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash = hash * a + (*str);
   a  = a * b;
  } 

  return hash;
}
/* End Of RS Hash Function */ 

unsigned int JSHash(char* str, unsigned int len)
{
  unsigned int hash = 1315423911;
  unsigned int i  = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash ^= ((hash << 5) + (*str) + (hash >> 2));
  } 

  return hash;
}
/* End Of JS Hash Function */ 

unsigned int PJWHash(char* str, unsigned int len)
{
  const unsigned int BitsInUnsignedInt = (unsigned int)(sizeof(unsigned int) * 8);
  const unsigned int ThreeQuarters   = (unsigned int)((BitsInUnsignedInt * 3) / 4);
  const unsigned int OneEighth     = (unsigned int)(BitsInUnsignedInt / 8);
  const unsigned int HighBits     = (unsigned int)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth);
  unsigned int hash       = 0;
  unsigned int test       = 0;
  unsigned int i         = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash = (hash << OneEighth) + (*str); 

   if((test = hash & HighBits) != 0)
   {
     hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));
   }
  } 

  return hash;
}
/* End Of P. J. Weinberger Hash Function */ 

unsigned int ELFHash(char* str, unsigned int len)
{
  unsigned int hash = 0;
  unsigned int x  = 0;
  unsigned int i  = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash = (hash << 4) + (*str);
   if((x = hash & 0xF0000000L) != 0)
   {
     hash ^= (x >> 24);
   }
   hash &= ~x;
  } 

  return hash;
}
/* End Of ELF Hash Function */ 

unsigned int BKDRHash(char* str, unsigned int len)
{
  unsigned int seed = 131; /* 31 131 1313 13131 131313 etc.. */
  unsigned int hash = 0;
  unsigned int i  = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash = (hash * seed) + (*str);
  } 

  return hash;
}
/* End Of BKDR Hash Function */ 

unsigned int SDBMHash(char* str, unsigned int len)
{
  unsigned int hash = 0;
  unsigned int i  = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash = (*str) + (hash << 6) + (hash << 16) - hash;
  } 

  return hash;
}
/* End Of SDBM Hash Function */ 

unsigned int DJBHash(char* str, unsigned int len)
{
  unsigned int hash = 5381;
  unsigned int i  = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash = ((hash << 5) + hash) + (*str);
  } 

  return hash;
}
/* End Of DJB Hash Function */ 

unsigned int DEKHash(char* str, unsigned int len)
{
  unsigned int hash = len;
  unsigned int i  = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash = ((hash << 5) ^ (hash >> 27)) ^ (*str);
  }
  return hash;
}
/* End Of DEK Hash Function */ 

unsigned int BPHash(char* str, unsigned int len)
{
  unsigned int hash = 0;
  unsigned int i  = 0;
  for(i = 0; i < len; str++, i++)
  {
   hash = hash << 7 ^ (*str);
  } 

  return hash;
}
/* End Of BP Hash Function */ 

unsigned int FNVHash(char* str, unsigned int len)
{
  const unsigned int fnv_prime = 0x811C9DC5;
  unsigned int hash   = 0;
  unsigned int i     = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash *= fnv_prime;
   hash ^= (*str);
  } 

  return hash;
}
/* End Of FNV Hash Function */ 

unsigned int APHash(char* str, unsigned int len)
{
  unsigned int hash = 0xAAAAAAAA;
  unsigned int i  = 0; 

  for(i = 0; i < len; str++, i++)
  {
   hash ^= ((i & 1) == 0) ? ( (hash << 7) ^ (*str) * (hash >> 3)) :
                (~((hash << 11) + ((*str) ^ (hash >> 5))));
  } 

  return hash;
}
/* End Of AP Hash Function */ 

以上就是小编为大家带来的常用Hash算法(C语言的简单实现)的全部内容了,希望对大家有所帮助,多多支持我们~

(0)

相关推荐

  • C语言 奇偶排序算法详解及实例代码

    C语言奇偶排序算法 奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序.该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换.下一步重复该操作,但针对所有的(偶-奇)位置数字对.如此交替进行下去. 使用奇偶排序法对一列随机数字进行排序的过程 处理器数组的排序 在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本地互连.所有处理器可同时与邻居进行比较.交

  • C语言对栈的实现基本操作

    c语言中栈是一种数据结构,后进先出,即最后进入栈的数据最先弹出.c语言中没有栈这种数据类型,需要自己编程构建.下面我们就一起来了解一下c语言中栈的基本操作. C语言对栈的实现基本操作,操作如下: #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <stdbool.h> typedef struct Node { int data; struct Node * pNext;

  • C语言 实现归并排序算法

    C语言 实现归并排序算法 归并排序(Merge sort)是创建在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 一个归并排序的例子:对一个随机点的链表进行排序 算法描述 归并操作的过程如下: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两个指针,最初位置分别为两个已经排序序列的起始位置 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针到达序列尾

  • C语言 数据结构中栈的实现代码

    数据结构中的栈是什么 举一个简单的例子:在往箱子里面放衣物的时候,放在最上面的衣物总是我们最后放上去的:而当我们从箱子里取出衣物的时候,总是最先拿出上面的.这就是现实生活中的栈. 准确的讲,栈就是一种可以实现"先进后出(或者叫后进先出)"的存储结构. 学过数据结构的人都知道:栈可以用两种方式来实现,一种方法是用数组实现栈,这种栈成为静态栈:另外一种方法是用链表实现栈,这种栈叫做动态栈. 栈中通常存放着程序的局部变量等.栈通常有出栈和入栈操作. 栈的结构 空栈的结构:[其实就是栈顶和栈顶

  • C语言中while与do-while的介绍与注意事项

    一.while和do-while的简介  1). while语句  语法: while(表达式){ 循环体; } 循环过程: 1.先判断表达式,是否为真,如果为真跳转到2,否则跳转到3 2.执行循环体,执行完毕,跳转到1 3.跳出循环 2). do-while语句 语法: do{ 循环体; }while(表达式);  注意:这个while后面的小括号必须接; 循环过程: 1.先执行循环体,执行完毕跳转到2 2.判断表达式的结果是否为真,如果为真,跳转到1,否则跳转到3 3.跳出循环 3). do

  • C语言实现的猴子分桃问题算法解决方案

    本文实例讲述了C语言实现的猴子分桃问题算法.分享给大家供大家参考,具体如下: 问题: 海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均 分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三.第四.第五只猴子都是这样做的,问海滩上原来最少有多少个桃子? 程序: #include<stdio.h> int divided(int n, int m) //注意该递归函数的定义 { if(n/5

  • C语言 动态内存分配的详解及实例

    1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确定的 (3)但是程序运行的过程中,可能需要使用一些额外的内存空间 2. malloc 和 free 函数 (1)malloc 和 free 用于执行动态内存分配的释放 (2)malloc 所分配的是一块连续的内存 (3)malloc 以字节为单位,并且返回值不带任何的类型信息:void* mallo

  • C语言 冒泡排序算法详解及实例

    C语言 冒泡排序算法 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序.尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的. 冒泡排序是与插入排序拥有相等的执

  • C语言演示对归并排序算法的优化实现

    基础 如果有两个数组已经有序,那么可以把这两个数组归并为更大的一个有序数组.归并排序便是建立在这一基础上.要将一个数组排序,可以将它划分为两个子数组分别排序,然后将结果归并,使得整体有序.子数组的排序同样采用这样的方法排序,这个过程是递归的. 下面是示例代码: #include "timsort.h" #include <stdlib.h> #include <string.h> // 将两个长度分别为l1, l2的已排序数组p1, p2合并为一个 // 已排序

  • 利用C语言实现2048小游戏的方法

    准备工作 首先上一张图,因为这里只是在用C语言验证算法,所以没有对界面做很好的优化,丑是理所应当的. 了解了游戏的工作原理,实际上可以将游戏描述为四个带有方向的同一操作: 1.将所有数字向一个方向移动至中间没有空位 2.将相邻的两个相同的数字加和然后放在更靠近移动方向前部的一个位置上 另外需要判断一下玩家当前输入的内容是否可以执行,如果不可以执行等待用户下一条记录. 同时需要对游戏的进程进行控制,如果可以继续游戏,那么运行玩家继续输入下一条指令,而如果不可以进行,那么提示无法继续游戏的提示. 首

  • windows中使用C# 调用 C语言生成的dll

    首先建立一个C语言源文件test.c void swap(int* a, int* b) { int c = *a; *a = *b; *b = c; } 然后下载mingw64,解压,进入到bin目录,查看是否有gcc.exe ,只要下载正确肯定是有的,可以把这个bin目录加入环境变量,就可以在任意地方运行gcc.偷懒的做法是直接把刚才做好的test.c复制到这个bin目录中,和gcc.exe在一个目录,然后在此目录下,按住shift键不松,再在空白处点击鼠标右键,就可以在右键菜单看见"在此目

  • 举例讲解C语言对归并排序算法的基础使用

    基础概念 百度百科是这么描述归并排序的: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作. 设有数列 {6,202,100,301,38,8,1} 初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数 i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3 i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4 i=3 [ 1 6 8 38 100 202 301 ] 4 总计: 1

  • socket多人聊天程序C语言版(一)

    首先,不要一步登天直接解决多人聊天这个问题,先把问题化简. 1.多人聊天的核心问题是服务器如何标识不同的客户端,如何根据客户端的需求转发消息给指定客户端. 2.多人聊天转化为C-C聊天,但是不再是直接C-C,而是通过server转发消息,所以变成==>C-S-C. 3.server如何允许2个client同时连接,设置listen函数的第二个参数,最大连接数. 4.server如何标识两个client,用一个结构体数组来存放两个client的信息. 5.server如何转发消息给client,很

随机推荐