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

相关文章

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Spring Boot 中 RestTemplate 的核心用法指南

《SpringBoot中RestTemplate的核心用法指南》本文详细介绍了RestTemplate的使用,包括基础用法、进阶配置技巧、实战案例以及最佳实践建议,通过一个腾讯地图路线规划的案... 目录一、环境准备二、基础用法全解析1. GET 请求的三种姿势2. POST 请求深度实践三、进阶配置技巧1

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

SpringBoot整合Zuul全过程

《SpringBoot整合Zuul全过程》Zuul网关是微服务架构中的重要组件,具备统一入口、鉴权校验、动态路由等功能,它通过配置文件进行灵活的路由和过滤器设置,支持Hystrix进行容错处理,还提供... 目录Zuul网关的作用Zuul网关的应用1、网关访问方式2、网关依赖注入3、网关启动器4、网关全局变

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoot的全局异常拦截实践过程

《SpringBoot的全局异常拦截实践过程》SpringBoot中使用@ControllerAdvice和@ExceptionHandler实现全局异常拦截,@RestControllerAdvic... 目录@RestControllerAdvice@ResponseStatus(...)@Except

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

Java 接口定义变量的示例代码

《Java接口定义变量的示例代码》文章介绍了Java接口中的变量和方法,接口中的变量必须是publicstaticfinal的,用于定义常量,而方法默认是publicabstract的,必须由实现类... 在 Java 中,接口是一种抽象类型,用于定义类必须实现的方法。接口可以包含常量和方法,但不能包含实例