zoukankan      html  css  js  c++  java
  • 各种字符串hash

    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);
        } 
    // 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);
    } 
    // JS Hash Function
    unsigned int JSHash(char *str){
      unsigned int hash = 1315423911; 
       while (*str) { 
       	hash ^= ((hash << 5) + (*str++) + (hash >> 2)); 
       } 
      return (hash & 0x7FFFFFFF);
    } 
    // 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);
       }
     // 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);
     }
     // 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);
    } 
    // DJB Hash Function
    unsigned int DJBHash(char *str){ 
    		unsigned int hash = 5381; 
    		  while (*str) { 
    		  	 hash += (hash << 5) + (*str++);
    		  } 
    	return (hash & 0x7FFFFFFF);
    } 
    // 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);
    }


  • 相关阅读:
    gcc开启C99或C11标准支持
    数组作为参数的四种声明方式
    [BZOJ 2654]tree(陈立杰)
    [HNOI 2014]道路堵塞
    [ZJOI 2006]书架
    [NOI 2010]超级钢琴
    汇编语言语法
    [洛谷P1714]切蛋糕
    [洛谷P1440]求m区间内的最小值
    [NOIP2016 TG D2T3]愤怒的小鸟
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3072138.html
Copyright © 2011-2022 走看看