Java工具集-哈希(HashUtil)

2024-06-01 16:18
文章标签 java 哈希 工具集 hashutil

本文主要是介绍Java工具集-哈希(HashUtil),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简单工具类

写作初衷:由于日常开发经常需要用到很多工具类,经常根据需求自己写也比较麻烦 网上好了一些工具类例如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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021495

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b