Java Hash算法

  1. /**
  2. * Hash算法大全<br>
  3. * 推荐使用FNV1算法
  4. * @algorithm None
  5. * @author Goodzzp 2006-11-20
  6. * @lastEdit Goodzzp 2006-11-20
  7. * @editDetail Create
  8. */
  9. public class HashAlgorithms
  10. {
  11. /**
  12. * 加法hash
  13. * @param key 字符串
  14. * @param prime 一个质数
  15. * @return hash结果
  16. */
  17. public static int additiveHash(String key, int prime)
  18. {
  19. int hash, i;
  20. for (hash = key.length(), i = 0; i < key.length(); i++)
  21. hash += key.charAt(i);
  22. return (hash % prime);
  23. }
  24. /**
  25. * 旋转hash
  26. * @param key 输入字符串
  27. * @param prime 质数
  28. * @return hash值
  29. */
  30. public static int rotatingHash(String key, int prime)
  31. {
  32. int hash, i;
  33. for (hash=key.length(), i=0; i<key.length(); ++i)
  34. hash = (hash<<4)^(hash>>28)^key.charAt(i);
  35. return (hash % prime);
  36. //   return (hash ^ (hash>>10) ^ (hash>>20));
  37. }
  38. // 替代:
  39. // 使用:hash = (hash ^ (hash>>10) ^ (hash>>20)) & mask;
  40. // 替代:hash %= prime;
  41. /**
  42. * MASK值,随便找一个值,最好是质数
  43. */
  44. static int M_MASK = 0x8765fed1;
  45. /**
  46. * 一次一个hash
  47. * @param key 输入字符串
  48. * @return 输出hash值
  49. */
  50. public static int oneByOneHash(String key)
  51. {
  52. int   hash, i;
  53. for (hash=0, i=0; i<key.length(); ++i)
  54. {
  55. hash += key.charAt(i);
  56. hash += (hash << 10);
  57. hash ^= (hash >> 6);
  58. }
  59. hash += (hash << 3);
  60. hash ^= (hash >> 11);
  61. hash += (hash << 15);
  62. //   return (hash & M_MASK);
  63. return hash;
  64. }
  65. /**
  66. * Bernstein‘s hash
  67. * @param key 输入字节数组
  68. * @param level 初始hash常量
  69. * @return 结果hash
  70. */
  71. public static int bernstein(String key)
  72. {
  73. int hash = 0;
  74. int i;
  75. for (i=0; i<key.length(); ++i) hash = 33*hash + key.charAt(i);
  76. return hash;
  77. }
  78. //
  79. //// Pearson‘s Hash
  80. // char pearson(char[]key, ub4 len, char tab[256])
  81. // {
  82. //   char hash;
  83. //   ub4 i;
  84. //   for (hash=len, i=0; i<len; ++i)
  85. //     hash=tab[hash^key[i]];
  86. //   return (hash);
  87. // }
  88. //// CRC Hashing,计算crc,具体代码见其他
  89. // ub4 crc(char *key, ub4 len, ub4 mask, ub4 tab[256])
  90. // {
  91. //   ub4 hash, i;
  92. //   for (hash=len, i=0; i<len; ++i)
  93. //     hash = (hash >> 8) ^ tab[(hash & 0xff) ^ key[i]];
  94. //   return (hash & mask);
  95. // }
  96. /**
  97. * Universal Hashing
  98. */
  99. public static int universal(char[]key, int mask, int[] tab)
  100. {
  101. int hash = key.length, i, len = key.length;
  102. for (i=0; i<(len<<3); i+=8)
  103. {
  104. char k = key[i>>3];
  105. if ((k&0x01) == 0) hash ^= tab[i+0];
  106. if ((k&0x02) == 0) hash ^= tab[i+1];
  107. if ((k&0x04) == 0) hash ^= tab[i+2];
  108. if ((k&0x08) == 0) hash ^= tab[i+3];
  109. if ((k&0x10) == 0) hash ^= tab[i+4];
  110. if ((k&0x20) == 0) hash ^= tab[i+5];
  111. if ((k&0x40) == 0) hash ^= tab[i+6];
  112. if ((k&0x80) == 0) hash ^= tab[i+7];
  113. }
  114. return (hash & mask);
  115. }
  116. /**
  117. * Zobrist Hashing
  118. */
  119. public static int zobrist( char[] key,int mask, int[][] tab)
  120. {
  121. int hash, i;
  122. for (hash=key.length, i=0; i<key.length; ++i)
  123. hash ^= tab[i][key[i]];
  124. return (hash & mask);
  125. }
  126. // LOOKUP3
  127. // 见Bob Jenkins(3).c文件
  128. // 32位FNV算法
  129. static int M_SHIFT = 0;
  130. /**
  131. * 32位的FNV算法
  132. * @param data 数组
  133. * @return int值
  134. */
  135. public static int FNVHash(byte[] data)
  136. {
  137. int hash = (int)2166136261L;
  138. for(byte b : data)
  139. hash = (hash * 16777619) ^ b;
  140. if (M_SHIFT == 0)
  141. return hash;
  142. return (hash ^ (hash >> M_SHIFT)) & M_MASK;
  143. }
  144. /**
  145. * 改进的32位FNV算法1
  146. * @param data 数组
  147. * @return int值
  148. */
  149. public static int FNVHash1(byte[] data)
  150. {
  151. final int p = 16777619;
  152. int hash = (int)2166136261L;
  153. for(byte b:data)
  154. hash = (hash ^ b) * p;
  155. hash += hash << 13;
  156. hash ^= hash >> 7;
  157. hash += hash << 3;
  158. hash ^= hash >> 17;
  159. hash += hash << 5;
  160. return hash;
  161. }
  162. /**
  163. * 改进的32位FNV算法1
  164. * @param data 字符串
  165. * @return int值
  166. */
  167. public static int FNVHash1(String data)
  168. {
  169. final int p = 16777619;
  170. int hash = (int)2166136261L;
  171. for(int i=0;i<data.length();i++)
  172. hash = (hash ^ data.charAt(i)) * p;
  173. hash += hash << 13;
  174. hash ^= hash >> 7;
  175. hash += hash << 3;
  176. hash ^= hash >> 17;
  177. hash += hash << 5;
  178. return hash;
  179. }
  180. /**
  181. * Thomas Wang的算法,整数hash
  182. */
  183. public static int intHash(int key)
  184. {
  185. key += ~(key << 15);
  186. key ^= (key >>> 10);
  187. key += (key << 3);
  188. key ^= (key >>> 6);
  189. key += ~(key << 11);
  190. key ^= (key >>> 16);
  191. return key;
  192. }
  193. /**
  194. * RS算法hash
  195. * @param str 字符串
  196. */
  197. public static int RSHash(String str)
  198. {
  199. int b    = 378551;
  200. int a    = 63689;
  201. int hash = 0;
  202. for(int i = 0; i < str.length(); i++)
  203. {
  204. hash = hash * a + str.charAt(i);
  205. a    = a * b;
  206. }
  207. return (hash & 0x7FFFFFFF);
  208. }
  209. /* End Of RS Hash Function */
  210. /**
  211. * JS算法
  212. */
  213. public static int JSHash(String str)
  214. {
  215. int hash = 1315423911;
  216. for(int i = 0; i < str.length(); i++)
  217. {
  218. hash ^= ((hash << 5) + str.charAt(i) + (hash >> 2));
  219. }
  220. return (hash & 0x7FFFFFFF);
  221. }
  222. /* End Of JS Hash Function */
  223. /**
  224. * PJW算法
  225. */
  226. public static int PJWHash(String str)
  227. {
  228. int BitsInUnsignedInt = 32;
  229. int ThreeQuarters     = (BitsInUnsignedInt * 3) / 4;
  230. int OneEighth         = BitsInUnsignedInt / 8;
  231. int HighBits          = 0xFFFFFFFF << (BitsInUnsignedInt - OneEighth);
  232. int hash              = 0;
  233. int test              = 0;
  234. for(int i = 0; i < str.length();i++)
  235. {
  236. hash = (hash << OneEighth) + str.charAt(i);
  237. if((test = hash & HighBits) != 0)
  238. {
  239. hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));
  240. }
  241. }
  242. return (hash & 0x7FFFFFFF);
  243. }
  244. /* End Of P. J. Weinberger Hash Function */
  245. /**
  246. * ELF算法
  247. */
  248. public static int ELFHash(String str)
  249. {
  250. int hash = 0;
  251. int x    = 0;
  252. for(int i = 0; i < str.length(); i++)
  253. {
  254. hash = (hash << 4) + str.charAt(i);
  255. if((x = (int)(hash & 0xF0000000L)) != 0)
  256. {
  257. hash ^= (x >> 24);
  258. hash &= ~x;
  259. }
  260. }
  261. return (hash & 0x7FFFFFFF);
  262. }
  263. /* End Of ELF Hash Function */
  264. /**
  265. * BKDR算法
  266. */
  267. public static int BKDRHash(String str)
  268. {
  269. int seed = 131; // 31 131 1313 13131 131313 etc..
  270. int hash = 0;
  271. for(int i = 0; i < str.length(); i++)
  272. {
  273. hash = (hash * seed) + str.charAt(i);
  274. }
  275. return (hash & 0x7FFFFFFF);
  276. }
  277. /* End Of BKDR Hash Function */
  278. /**
  279. * SDBM算法
  280. */
  281. public static int SDBMHash(String str)
  282. {
  283. int hash = 0;
  284. for(int i = 0; i < str.length(); i++)
  285. {
  286. hash = str.charAt(i) + (hash << 6) + (hash << 16) - hash;
  287. }
  288. return (hash & 0x7FFFFFFF);
  289. }
  290. /* End Of SDBM Hash Function */
  291. /**
  292. * DJB算法
  293. */
  294. public static int DJBHash(String str)
  295. {
  296. int hash = 5381;
  297. for(int i = 0; i < str.length(); i++)
  298. {
  299. hash = ((hash << 5) + hash) + str.charAt(i);
  300. }
  301. return (hash & 0x7FFFFFFF);
  302. }
  303. /* End Of DJB Hash Function */
  304. /**
  305. * DEK算法
  306. */
  307. public static int DEKHash(String str)
  308. {
  309. int hash = str.length();
  310. for(int i = 0; i < str.length(); i++)
  311. {
  312. hash = ((hash << 5) ^ (hash >> 27)) ^ str.charAt(i);
  313. }
  314. return (hash & 0x7FFFFFFF);
  315. }
  316. /* End Of DEK Hash Function */
  317. /**
  318. * AP算法
  319. */
  320. public static int APHash(String str)
  321. {
  322. int hash = 0;
  323. for(int i = 0; i < str.length(); i++)
  324. {
  325. hash ^= ((i & 1) == 0) ? ( (hash << 7) ^ str.charAt(i) ^ (hash >> 3)) :
  326. (~((hash << 11) ^ str.charAt(i) ^ (hash >> 5)));
  327. }
  328. //       return (hash & 0x7FFFFFFF);
  329. return hash;
  330. }
  331. /* End Of AP Hash Function */
  332. /**
  333. * JAVA自己带的算法
  334. */
  335. public static int java(String str)
  336. {
  337. int h = 0;
  338. int off = 0;
  339. int len = str.length();
  340. for (int i = 0; i < len; i++)
  341. {
  342. h = 31 * h + str.charAt(off++);
  343. }
  344. return h;
  345. }
  346. /**
  347. * 混合hash算法,输出64位的值
  348. */
  349. public static long mixHash(String str)
  350. {
  351. long hash = str.hashCode();
  352. hash <<= 32;
  353. hash |= FNVHash1(str);
  354. return hash;
  355. }
时间: 2024-10-09 05:04:55

Java Hash算法的相关文章

对一致性Hash算法,Java代码实现的深入研究

一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在

Java密码学原型算法实现——第一部分:标准Hash算法

题注 从博客中看出来我是个比较钟爱Java的应用密码学研究者.虽然C在密码学中有不可替代的优势:速度快,但是,Java的可移植性使得开发人员可以很快地将代码移植到各个平台,这比C实现要方便的多.尤其是Android平台的出现,Java的应用也就越来越广.因此,我本人在密码学研究过程中实际上也在逐渐使用和封装一些知名的Java密码学库,主要是方便自己使用. Java JDK实际上自带了密码学库,支持几乎所有通用密码学原型的实现.然而,自带密码库有几个缺点:第一,由于版权问题,其并不支持全部的密码学

【数据结构与算法】一致性Hash算法及Java实践

追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机器的系统信息到后台,后台可以查询到有哪些server在提供服务,根据负载均衡算法(简单的轮询)指定由哪个server进行查询,并将消息发送到Kafka,然后所有的server消费Kafka的信息,当发现消费的信息要求自己进行查询时,就连接指定的machine进行查询,并将结果返回回去. Server

【转载】对一致性Hash算法,Java代码实现的深入研究

原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这

Java中的HashCode(1)之hash算法基本原理

Java中的HashCode(1)之hash算法基本原理 2012-11-16 14:58:59     我来说两句      作者:woshixuye 收藏    我要投稿 一.为什么要有Hash算法 Java中 的集合有两类,一类是List,一类是Set.List内的元素是有序的,元素可以重复.Set元素无序,但元素不可重复.要想保证元素不重复,两个元素 是否重复应该依据什么来判断呢?用Object.equals方法.但若每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的

转: memcached Java客户端spymemcached的一致性Hash算法

转自:http://colobu.com/2015/04/13/consistent-hash-algorithm-in-java-memcached-client/ memcached Java客户端spymemcached的一致性Hash算法 最近看到两篇文章,一个是江南白衣的陌生但默默一统江湖的MurmurHash,另外一篇是张洋的一致性哈希算法及其在分布式系统中的应用.虽然我在项目中使用memcached的java客户端spymemcached好几年了,但是对它的一致性哈希算法的细节从来

一致性hash算法及java实现

一致性hash算法是分布式中一个常用且好用的分片算法.或者数据库分库分表算法.现在的互联网服务架构中,为避免单点故障.提升处理效率.横向扩展等原因,分布式系统已经成为了居家旅行必备的部署模式,所以也产出了几种数据分片的方法: 1.取模,2.划段,3.一致性hash 前两种有很大的一个问题就是需要固定的节点数,即节点数不能变,不能某一个节点挂了或者实时增加一个节点,变了分片规则就需要改变,需要迁移的数据也多. 那么一致性hash是怎么解决这个问题的呢? 一致性hash:对节点和数据,都做一次has

一致性Hash算法原理,java实现,及用途

学习记录: 一致性Hash算法原理及java实现:https://blog.csdn.net/suifeng629/article/details/81567777 一致性Hash算法介绍,原理,及使用场景:https://blog.csdn.net/cbmljs/article/details/88021598 纯转载,侵删 原文地址:https://www.cnblogs.com/dupei/p/12054368.html

分布式算法(一致性Hash算法)

一.分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Response Time).加权法(Weighted )等.其中哈希算法是最为常用的算法. 典型的应用场景是: 有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务器上,每台机器负责1/N的服务. 常用的算法是对hash结果取余数 (hash() mod N ):对机器编号