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五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

22.手绘Spring DI运行时序图

1.依赖注入发生的时间 当Spring loC容器完成了 Bean定义资源的定位、载入和解析注册以后,loC容器中已经管理类Bean 定义的相关数据,但是此时loC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况 发生: 、用户第一次调用getBean()方法时,loC容器触发依赖注入。 、当用户在配置文件中将<bean>元素配置了 lazy-init二false属性,即让