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编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis