简单工具类

写作初衷:由于日常开发经常需要用到很多工具类,经常根据需求自己写也比较麻烦 网上好了一些工具类例如commom.lang3或者hutool或者Jodd这样的开源工具,但是 发现他们之中虽然设计不错,但是如果我想要使用,就必须要引入依赖并且去维护依赖,有些 甚至会有存在版本编译不通过问题,故此想要写作一个每个类都可以作为独立工具类使用 每个使用者只需要复制该类,到任何项目当中都可以使用,所以需要尊从以下两个原则才能 做到.在此诚邀各位大佬参与.可以把各自用过的工具,整合成只依赖JDK,每个类都能够单独 使用的工具.每个人当遇到业务需求需要使用的时候,只需要到这里单独拷贝一个即可使用. 抛弃传统的需要引入依赖的烦恼.让大家一起来解决你所面临的业务问题吧!

介绍

遵从两大原则

  • 1.绝不依赖JDK以外的源码
  • 2.牺牲代码复用性,每个类都必须是单独的组件,绝不互相引用,做到完全解耦
package *;/*** @program: simple_tools* @description:* @author: ChenWenLong* @create: 2019-05-23 16:01**/
public class HashUtil {private static final int R1_32 = 15;private static final int R2_32 = 13;private static final int M_32 = 5;private static final int N_32 = 0xe6546b64;private static final int C1_32 = 0xcc9e2d51;private static final int C2_32 = 0x1b873593;private static final int DEFAULT_SEED = 0;/*** 加法hash** @param key 字符串* @param prime 一个质数* @return hash结果*/public static int additiveHash(String key, int prime) {int hash, i;for (hash = key.length(), i = 0; i < key.length(); i++) {hash += key.charAt(i);}return hash % prime;}/*** 旋转hash** @param key 输入字符串* @param prime 质数* @return hash值*/public static int rotatingHash(String key, int prime) {int hash, i;for (hash = key.length(), i = 0; i < key.length(); ++i) {hash = (hash << 4) ^ (hash >> 28) ^ key.charAt(i);}return hash % prime;}/*** 一次一个hash** @param key 输入字符串* @return 输出hash值*/public static int oneByOneHash(String key) {int hash, i;for (hash = 0, i = 0; i < key.length(); ++i) {hash += key.charAt(i);hash += (hash << 10);hash ^= (hash >> 6);}hash += (hash << 3);hash ^= (hash >> 11);hash += (hash << 15);return hash;}/*** Bernstein's hash** @param key 输入字节数组* @return 结果hash*/public static int bernstein(String key) {int hash = 0;int i;for (i = 0; i < key.length(); ++i) {hash = 33 * hash + key.charAt(i);}return hash;}/*** Universal Hashing** @param key 字节数组* @param mask 掩码* @param tab tab* @return hash值*/public static int universal(char[] key, int mask, int[] tab) {int hash = key.length, i, len = key.length;for (i = 0; i < (len << 3); i += 8) {char k = key[i >> 3];if ((k & 0x01) == 0) {hash ^= tab[i + 0];}if ((k & 0x02) == 0) {hash ^= tab[i + 1];}if ((k & 0x04) == 0) {hash ^= tab[i + 2];}if ((k & 0x08) == 0) {hash ^= tab[i + 3];}if ((k & 0x10) == 0) {hash ^= tab[i + 4];}if ((k & 0x20) == 0) {hash ^= tab[i + 5];}if ((k & 0x40) == 0) {hash ^= tab[i + 6];}if ((k & 0x80) == 0) {hash ^= tab[i + 7];}}return (hash & mask);}/*** Zobrist Hashing** @param key 字节数组* @param mask 掩码* @param tab tab* @return hash值*/public static int zobrist(char[] key, int mask, int[][] tab) {int hash, i;for (hash = key.length, i = 0; i < key.length; ++i) {hash ^= tab[i][key[i]];}return (hash & mask);}/*** 改进的32位FNV算法1** @param data 数组* @return hash结果*/public static int fnvHash(byte[] data) {final int p = 16777619;int hash = (int) 2166136261L;for (byte b : data) {hash = (hash ^ b) * p;}hash += hash << 13;hash ^= hash >> 7;hash += hash << 3;hash ^= hash >> 17;hash += hash << 5;return hash;}/*** 改进的32位FNV算法1** @param data 字符串* @return hash结果*/public static int fnvHash(String data) {final int p = 16777619;int hash = (int) 2166136261L;for (int i = 0; i < data.length(); i++) {hash = (hash ^ data.charAt(i)) * p;}hash += hash << 13;hash ^= hash >> 7;hash += hash << 3;hash ^= hash >> 17;hash += hash << 5;return hash;}/*** Thomas Wang的算法,整数hash** @param key 整数* @return hash值*/public static int intHash(int key) {key += ~(key << 15);key ^= (key >>> 10);key += (key << 3);key ^= (key >>> 6);key += ~(key << 11);key ^= (key >>> 16);return key;}/*** RS算法hash** @param str 字符串* @return hash值*/public static int rsHash(String str) {int b = 378551;int a = 63689;int hash = 0;for (int i = 0; i < str.length(); i++) {hash = hash * a + str.charAt(i);a = a * b;}return hash & 0x7FFFFFFF;}/*** JS算法** @param str 字符串* @return hash值*/public static int jsHash(String str) {int hash = 1315423911;for (int i = 0; i < str.length(); i++) {hash ^= ((hash << 5) + str.charAt(i) + (hash >> 2));}return hash & 0x7FFFFFFF;}/*** PJW算法** @param str 字符串* @return hash值*/public static int pjwHash(String str) {int bitsInUnsignedInt = 32;int threeQuarters = (bitsInUnsignedInt * 3) / 4;int oneEighth = bitsInUnsignedInt / 8;int highBits = 0xFFFFFFFF << (bitsInUnsignedInt - oneEighth);int hash = 0;int test = 0;for (int i = 0; i < str.length(); i++) {hash = (hash << oneEighth) + str.charAt(i);if ((test = hash & highBits) != 0) {hash = ((hash ^ (test >> threeQuarters)) & (~highBits));}}return hash & 0x7FFFFFFF;}/*** ELF算法** @param str 字符串* @return hash值*/public static int elfHash(String str) {int hash = 0;int x = 0;for (int i = 0; i < str.length(); i++) {hash = (hash << 4) + str.charAt(i);if ((x = (int) (hash & 0xF0000000L)) != 0) {hash ^= (x >> 24);hash &= ~x;}}return hash & 0x7FFFFFFF;}/*** BKDR算法** @param str 字符串* @return hash值*/public static int bkdrHash(String str) {int seed = 131; // 31 131 1313 13131 131313 etc..int hash = 0;for (int i = 0; i < str.length(); i++) {hash = (hash * seed) + str.charAt(i);}return hash & 0x7FFFFFFF;}/*** SDBM算法** @param str 字符串* @return hash值*/public static int sdbmHash(String str) {int hash = 0;for (int i = 0; i < str.length(); i++) {hash = str.charAt(i) + (hash << 6) + (hash << 16) - hash;}return hash & 0x7FFFFFFF;}/*** DJB算法** @param str 字符串* @return hash值*/public static int djbHash(String str) {int hash = 5381;for (int i = 0; i < str.length(); i++) {hash = ((hash << 5) + hash) + str.charAt(i);}return hash & 0x7FFFFFFF;}/*** DEK算法** @param str 字符串* @return hash值*/public static int dekHash(String str) {int hash = str.length();for (int i = 0; i < str.length(); i++) {hash = ((hash << 5) ^ (hash >> 27)) ^ str.charAt(i);}return hash & 0x7FFFFFFF;}/*** AP算法** @param str 字符串* @return hash值*/public static int apHash(String str) {int hash = 0;for (int i = 0; i < str.length(); i++) {hash ^= ((i & 1) == 0) ? ((hash << 7) ^ str.charAt(i) ^ (hash >> 3)) : (~((hash << 11) ^ str.charAt(i) ^ (hash >> 5)));}// return (hash & 0x7FFFFFFF);return hash;}/*** TianL Hash算法** @param str 字符串* @return Hash值*/public static long tianlHash(String str) {long hash = 0;int iLength = str.length();if (iLength == 0) {return 0;}if (iLength <= 256) {hash = 16777216L * (iLength - 1);} else {hash = 4278190080L;}int i;char ucChar;if (iLength <= 96) {for (i = 1; i <= iLength; i++) {ucChar = str.charAt(i - 1);if (ucChar <= 'Z' && ucChar >= 'A') {ucChar = (char) (ucChar + 32);}hash += (3 * i * ucChar * ucChar + 5 * i * ucChar + 7 * i + 11 * ucChar) % 16777216;}} else {for (i = 1; i <= 96; i++) {ucChar = str.charAt(i + iLength - 96 - 1);if (ucChar <= 'Z' && ucChar >= 'A') {ucChar = (char) (ucChar + 32);}hash += (3 * i * ucChar * ucChar + 5 * i * ucChar + 7 * i + 11 * ucChar) % 16777216;}}if (hash < 0) {hash *= -1;}return hash;}/*** JAVA自己带的算法** @param str 字符串* @return hash值*/public static int javaDefaultHash(String str) {int h = 0;int off = 0;int len = str.length();for (int i = 0; i < len; i++) {h = 31 * h + str.charAt(off++);}return h;}/*** 混合hash算法,输出64位的值** @param str 字符串* @return hash值*/public static long mixHash(String str) {long hash = str.hashCode();hash <<= 32;hash |= fnvHash(str);return hash;}/*** 根据对象的内存地址生成相应的Hash值** @param obj 对象* @return hash值* @since 4.2.2*/public static int identityHashCode(Object obj) {return System.identityHashCode(obj);}/*** MurmurHash算法32-bit实现** @param data 数据* @return hash值* @since 4.3.3*/public static int murmur32(byte[] data) {int length = data.length;int hash = DEFAULT_SEED;final int nblocks = length >> 2;// bodyfor (int i = 0; i < nblocks; i++) {int i_4 = i << 2;int k = (data[i_4] & 0xff) //| ((data[i_4 + 1] & 0xff) << 8) //| ((data[i_4 + 2] & 0xff) << 16) //| ((data[i_4 + 3] & 0xff) << 24);// mix functionsk *= C1_32;k = Integer.rotateLeft(k, R1_32);k *= C2_32;hash ^= k;hash = Integer.rotateLeft(hash, R2_32) * M_32 + N_32;}// tailint idx = nblocks << 2;int k1 = 0;switch (length - idx) {case 3:k1 ^= data[idx + 2] << 16;case 2:k1 ^= data[idx + 1] << 8;case 1:k1 ^= data[idx];// mix functionsk1 *= C1_32;k1 = Integer.rotateLeft(k1, R1_32);k1 *= C2_32;hash ^= k1;}// finalizationhash ^= length;hash ^= (hash >>> 16);hash *= 0x85ebca6b;hash ^= (hash >>> 13);hash *= 0xc2b2ae35;hash ^= (hash >>> 16);return hash;}/*** MurmurHash算法64-bit实现** @param data 数据* @return hash值* @since 4.3.3*/public static long murmur64(byte[] data) {return hash64(data);}private static long hash64(byte[] data) {return 0;}/*** MurmurHash算法128-bit实现** @param data 数据* @return hash值* @since 4.3.3*/public static long[] murmur128(byte[] data) {return hash128(data);}private static long[] hash128(byte[] data) {return new long[0];}
}

Java工具集-哈希(HashUtil)相关推荐

  1. java jodd_Jodd :一款优雅的 Java 工具集

    原标题:Jodd :一款优雅的 Java 工具集 来源:coderknock, coderknock.com/blog/2016/07/02/Jodd.html 为大家介绍一个几乎全能的Java类库- ...

  2. 【工具集】WTool JAVA工具集

    依赖于Hutool <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all< ...

  3. Java 工具集 Hutool 4.0.8 发布

    2019独角兽企业重金招聘Python工程师标准>>> Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以" ...

  4. Java工具集-身份证(IDCardUtil)

    简单工具类 写作初衷:由于日常开发经常需要用到很多工具类,经常根据需求自己写也比较麻烦 网上好了一些工具类例如commom.lang3或者hutool或者Jodd这样的开源工具,但是 发现他们之中虽然 ...

  5. Java工具集-MD5加密工具

    简单工具类 写作初衷:由于日常开发经常需要用到很多工具类,经常根据需求自己写也比较麻烦 网上好了一些工具类例如commom.lang3或者hutool或者Jodd这样的开源工具,但是 发现他们之中虽然 ...

  6. java工具集_Java 工具集

    在 sudo -u tomcat 状态下执行 1. jstack jstack pid >> file : 打印当前 thread stack 状态 CPU 高分析流程 使用jstack分 ...

  7. Java工具集-HMacSHA1加解密

    代码示例 import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEnco ...

  8. Java工具集-Java游戏台球

    图片准备 请将以下两张图片拷贝到代码对应路径下 代码示例 package *;import javax.swing.*; import java.awt.*;/*** @program: simple ...

  9. java aqua和metal_Java工具集介绍9_16

    Java工具集介绍9_16 1)Coldtags suite 最新版本是3.10版. 这个集提供了超过310个JSP定制标签,解决了JSP开发者面临的大多通常任务.Coldtags集伴随着大量的.封装 ...

最新文章

  1. VS2010/MFC编程入门之十七(对话框:文件对话框)
  2. Base64编码运用与基本原理
  3. 前端学习(3252):react脚手架
  4. 程序员下班回家,路上被拦…
  5. python3 字典合并_python3字典合并怎么做?
  6. Google推出一款用户隐私保护工具箱
  7. MindNode 5 for Mac(思维导图)中文版
  8. ES+Redis+MySQL,这个高可用架构设计太顶了!
  9. “2016年度优秀软件工程造价师”“工信部行业标准《软件研发成本度量规范》2016年度应用示范单位” 评选活动正式启动...
  10. 相片审核处理工具步骤_相片
  11. 双色球助手2.0---最新发布----完全免费
  12. 计划策略(planning strategy)
  13. evernote 有道_如何备份Evernote笔记本(以防万一)
  14. Python学习笔记(三)(图灵学院)
  15. 故宫元宵灯会黄牛票最高要5千 律师:小心被拒
  16. 2016小米校招笔试题
  17. 如何在excel单词后面批量加固定文字?
  18. Win32 API 三两事
  19. Java介绍和基础知识
  20. JavaScript | 正则表达式

热门文章

  1. 43岁,外企经理,公司不和我续签了
  2. 2021-6-10-今日收获
  3. MATLAB/OpenCV--基于棋盘格相机标定教程
  4. 高清电影播放机选购知识——附30余款播放机资料(1)
  5. Matlab 矩阵元素选取方法
  6. 《当杜月笙被人骗惨之时,突然看到了这世界的一个大秘密-雾满拦江》
  7. macM1芯片通过第三方安装php
  8. python中的随机数种子seed()
  9. 如何在 iPhone 上恢复已删除的短信
  10. 4.11 51单片机-LCD1602显示屏