各种字符串hash函数

本文详细介绍了Java中常用的几种字符串哈希算法,包括BKDR哈希、SDBM哈希、RS哈希等,并解释了它们的工作原理和特点。
  1. /// @brief BKDR Hash Function  
  2. /// @detail 本 算法由于在Brian Kernighan与Dennis Ritchie的《The C Programming Language》一书被展示而得 名,是一种简单快捷的hash算法,也是Java目前采用的字符串的Hash算法(累乘因子为31)。  
  3. size_t BKDRHash(const char *str)  
  4. {  
  5.     register size_t hash = 0;  
  6.     while (size_t ch = (size_t)*str++)  
  7.     {         
  8.         hash = hash * 131 + ch;   // 也可以乘以31、131、1313、13131、131313..  
  9.         // 有人说将乘法分解为位运算及加减法可以提高效率,如将上式表达为:hash = hash << 7 + hash << 1 + hash + ch;  
  10.         // 但其实在Intel平台上,CPU内部对二者的处理效率都是差不多的,  
  11.         // 我分别进行了100亿次的上述两种运算,发现二者时间差距基本为0(如果是Debug版,分解成位运算后的耗时还要高1/3);  
  12.         // 在ARM这类RISC系统上没有测试过,由于ARM内部使用Booth's Algorithm来模拟32位整数乘法运算,它的效率与乘数有关:  
  13.         // 当乘数8-31位都为1或0时,需要1个时钟周期  
  14.         // 当乘数16-31位都为1或0时,需要2个时钟周期  
  15.         // 当乘数24-31位都为1或0时,需要3个时钟周期  
  16.         // 否则,需要4个时钟周期  
  17.         // 因此,虽然我没有实际测试,但是我依然认为二者效率上差别不大          
  18.     }  
  19.     return hash;  
  20. }  
  21. /// @brief SDBM Hash Function  
  22. /// @detail 本算法是由于在开源项目SDBM(一种简单的数据库引擎)中被应用而得名,它与BKDRHash思想一致,只是种子不同而已。  
  23. size_t SDBMHash(const char *str)  
  24. {  
  25.     register size_t hash = 0;  
  26.     while (size_t ch = (size_t)*str++)  
  27.     {  
  28.         hash = 65599 * hash + ch;         
  29.         //hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;  
  30.     }  
  31.     return hash;  
  32. }  
  33. /// @brief RS Hash Function  
  34. /// @detail 因Robert Sedgwicks在其《Algorithms in C》一书中展示而得名。  
  35. size_t RSHash(const char  *str)  
  36. {  
  37.     register size_t hash = 0;  
  38.     size_t magic = 63689;     
  39.     while (size_t ch = (size_t)*str++)  
  40.     {  
  41.         hash = hash * magic + ch;  
  42.         magic *= 378551;  
  43.     }  
  44.     return hash;  
  45. }  
  46. /// @brief AP Hash Function  
  47. /// @detail 由Arash Partow发明的一种hash算法。  
  48. size_t APHash(const char  *str)  
  49. {  
  50.     register size_t hash = 0;  
  51.     size_t ch;  
  52.     for (long i = 0; ch = (size_t)*str++; i++)  
  53.     {  
  54.         if ((i & 1) == 0)  
  55.         {  
  56.             hash ^= ((hash << 7) ^ ch ^ (hash >> 3));  
  57.         }  
  58.         else  
  59.         {  
  60.             hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));  
  61.         }  
  62.     }  
  63.     return hash;  
  64. }  
  65. /// @brief JS Hash Function  
  66. /// 由Justin Sobel发明的一种hash算法。  
  67. size_t JSHash(const char  *str)  
  68. {  
  69.     if(!*str)        // 这是由本人添加,以保证空字符串返回哈希值0  
  70.         return 0;  
  71.     register size_t hash = 1315423911;  
  72.     while (size_t ch = (size_t)*str++)  
  73.     {  
  74.         hash ^= ((hash << 5) + ch + (hash >> 2));  
  75.     }  
  76.     return hash;  
  77. }  
  78. /// @brief DEK Function  
  79. /// @detail 本算法是由于Donald E. Knuth在《Art Of Computer Programming Volume 3》中展示而得名。  
  80. size_t DEKHash(const char * str)  
  81. {  
  82.     if(!*str)        // 这是由本人添加,以保证空字符串返回哈希值0  
  83.         return 0;  
  84.     register size_t hash = 1315423911;  
  85.     while (size_t ch = (size_t)*str++)  
  86.     {  
  87.         hash = ((hash << 5) ^ (hash >> 27)) ^ ch;  
  88.     }  
  89.     return hash;  
  90. }  
  91. /// @brief FNV Hash Function  
  92. /// @detail Unix system系统中使用的一种著名hash算法,后来微软也在其hash_map中实现。  
  93. size_t FNVHash(const char * str)  
  94. {  
  95.     if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0  
  96.         return 0;  
  97.     register size_t hash = 2166136261;  
  98.     while (size_t ch = (size_t)*str++)  
  99.     {  
  100.         hash *= 16777619;  
  101.         hash ^= ch;  
  102.     }  
  103.     return hash;  
  104. }  
  105. /// @brief DJB Hash Function  
  106. /// @detail 由Daniel J. Bernstein教授发明的一种hash算法。  
  107. size_t DJBHash(const char  *str)  
  108. {  
  109.     if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0  
  110.         return 0;  
  111.     register size_t hash = 5381;  
  112.     while (size_t ch = (size_t)*str++)  
  113.     {  
  114.         hash += (hash << 5) + ch;  
  115.     }  
  116.     return hash;  
  117. }  
  118. /// @brief DJB Hash Function 2  
  119. /// @detail 由Daniel J. Bernstein 发明的另一种hash算法。  
  120. size_t DJB2Hash(const char  *str)  
  121. {  
  122.     if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0  
  123.         return 0;  
  124.     register size_t hash = 5381;  
  125.     while (size_t ch = (size_t)*str++)  
  126.     {  
  127.         hash = hash * 33 ^ ch;  
  128.     }  
  129.     return hash;  
  130. }  
  131. /// @brief PJW Hash Function  
  132. /// @detail 本算法是基于AT&T贝尔实验室的Peter J. Weinberger的论文而发明的一种hash算法。  
  133. size_t PJWHash(const char  *str)  
  134. {  
  135.     static const size_t TotalBits       = sizeof(size_t) * 8;  
  136.     static const size_t ThreeQuarters   = (TotalBits  * 3) / 4;  
  137.     static const size_t OneEighth       = TotalBits / 8;  
  138.     static const size_t HighBits        = ((size_t)-1) << (TotalBits - OneEighth);      
  139.       
  140.     register size_t hash = 0;  
  141.     size_t magic = 0;     
  142.     while (size_t ch = (size_t)*str++)  
  143.     {  
  144.         hash = (hash << OneEighth) + ch;  
  145.         if ((magic = hash & HighBits) != 0)  
  146.         {  
  147.             hash = ((hash ^ (magic >> ThreeQuarters)) & (~HighBits));  
  148.         }  
  149.     }  
  150.     return hash;  
  151. }  
  152. /// @brief ELF Hash Function  
  153. /// @detail 由于在Unix的Extended Library Function被附带而得名的一种hash算法,它其实就是PJW Hash的变形。  
  154. size_t ELFHash(const char  *str)  
  155. {  
  156.     static const size_t TotalBits       = sizeof(size_t) * 8;  
  157.     static const size_t ThreeQuarters   = (TotalBits  * 3) / 4;  
  158.     static const size_t OneEighth       = TotalBits / 8;  
  159.     static const size_t HighBits        = ((size_t)-1) << (TotalBits - OneEighth);      
  160.     register size_t hash = 0;  
  161.     size_t magic = 0;  
  162.     while (size_t ch = (size_t)*str++)  
  163.     {  
  164.         hash = (hash << OneEighth) + ch;  
  165.         if ((magic = hash & HighBits) != 0)  
  166.         {  
  167.             hash ^= (magic >> ThreeQuarters);  
  168.             hash &= ~magic;  
  169.         }         
  170.     }  
  171.     return hash;  
  172. }  
【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最大间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度与位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C与核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法与机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值