import java.math.BigDecimal;
import java.util.Random;/*** “中间相遇法”是生日攻击的一种变形,它不比较Hash值,而是比较链中的中间变量。这种攻击主要适用于攻击具有分组链结构的Hash方案。* 中间相遇攻击的基本原理为* :将消息分成两部分,对伪造消息的第一部分从初试值开始逐步向中间阶段产生r1个变量;对伪造消息的第二部分从Hash结果开始逐步退回中间阶段产生r2个变量* 。在中间阶段有一个匹配的概率与生日攻击成功的概率一样。*/
//Java构建HashCode相同字符串算法,可以简单理解为hashcode的逆向运算。
public class HashCollide {/*** 拼凑字符的起始值(最后实际值可能为 collideCharBase +- mulBase)*/private int collideCharBase;/*** 中间变量*/private BigDecimal collideCharBase_decimal;/*** 中间变量*/private BigDecimal mulBase_decimal_pow;/*** 拼凑字符串长度*/private int collideCharLength;/*** hash算法中采用的乘积值 (hash' = hash * mulBase + char[i])*/private long mulBase;/*** 中间变量*/private BigDecimal mulBase_decimal;/*** 中间变量*/private long mulBase_desc;/*** 中间变量*/private BigDecimal mulBase_desc_decimal;/*** 2的轮回...*/private final long INT_ROUTE_NUMBER = 2l << 32;/*** 还是2的轮回...*/private final BigDecimal DECIMAL_ROUTE_NUMBER = new BigDecimal(INT_ROUTE_NUMBER);/*** 不知道干啥的,好奇怪*/private final Random random = new Random(System.nanoTime());/*** 测试你的char数组能吧srcHash变成什么样子* * @param srcHash* @param collide* @return*/public int hashCodeTest(int srcHash, char collide[]) {int h = srcHash;int len = collide.length;for (int i = 0; i < len; i++) {h = (int) mulBase * h + collide[i];}return h;}/*** 根据这个类构造时设置的参数输出hash* * @param srcString* @return*/public int hashCodeTest(String srcString) {char[] chars = srcString.toCharArray();int h = 0;int len = chars.length;for (int i = 0; i < len; i++) {h = (int) mulBase * h + chars[i];}return h;}/*** 将一个decimal的值通过取余转换成一个属于int范围的long* * @param data* @return*/private long fixDecimal(BigDecimal data) {// 求余数BigDecimal sub = data.divideToIntegralValue(DECIMAL_ROUTE_NUMBER.multiply(DECIMAL_ROUTE_NUMBER));// 可能为负数,修正为long类型之后再次求余long val = data.subtract(sub).longValue();val += INT_ROUTE_NUMBER;val = val % INT_ROUTE_NUMBER;if (val < 0) // val应该不会小于0val += INT_ROUTE_NUMBER;return val;}/*** 把val转换为正序的char数组,用以表示一个n位k进制数据* * @param val* @return*/private char[] offsetToArray(long val) {char[] stk = new char[collideCharLength];int pos = 0;while (val != 0) { // 进制转换,得到反序列stk[pos++] = (char) (val % (mulBase) + collideCharBase);val = val / mulBase;}int fillZero = collideCharLength - pos; // 补零的个数char[] collides = new char[collideCharLength];int i = 0;while (i < fillZero) { // 高位补零collides[i++] = (char) collideCharBase;}while (i < collideCharLength) { // 逐位反向输出collides[i] = stk[pos - i + fillZero - 1]; // pos - ( i - fillZero )++i;}return collides;}/*** 根据hash的src和target生成一组序列,使原串后面附加序列字符后的hash与target相同* * @param src* @param target* @param collideCharBase* @param n* @return*/private char[] genCollisionArray(int src, int target) {long hx = mulBase_desc * src + collideCharBase;BigDecimal halfCal = mulBase_decimal_pow.multiply(new BigDecimal(hx)) // 中间变量.subtract(collideCharBase_decimal);BigDecimal left = halfCal.divide(mulBase_desc_decimal); // 依然是中间变量BigDecimal fix = new BigDecimal(target).subtract(left); // 还是中间变量,不过这次是修正数据long fixedDecimal = fixDecimal(fix);return offsetToArray(fixedDecimal);}/*** 构造函数* * @param collideCharBase*            拼凑字符的起始值(最后实际值可能为 collideCharBase +- mulBase)* @param collideCharLength*            拼凑字符串长度* @param mulBase*            hash算法中采用的乘积值 (hash' = hash * mulBase + char[i])*/public HashCollide(int collideCharBase, int collideCharLength, int mulBase) {this.mulBase = mulBase;this.mulBase_decimal = new BigDecimal(mulBase);this.mulBase_desc = mulBase - 1;this.mulBase_desc_decimal = new BigDecimal(mulBase - 1);this.mulBase_decimal_pow = mulBase_decimal.pow(collideCharLength);this.collideCharBase = collideCharBase;this.collideCharBase_decimal = new BigDecimal(collideCharBase);this.collideCharLength = collideCharLength;}/*** ...* * @param source* @param targetHash* @return*/public String collide(String source, int targetHash) {int hashSrc = source.hashCode();char[] collide = this.genCollisionArray(hashSrc, targetHash);return source.concat(new String(collide));}/*** ...* * @return*/public String randomString(int length) {char[] chars = new char[length];for (int i = 0; i < length; ++i) {chars[i] = (char) (50 + random.nextInt(32 + 26 + 15));}return new String(chars);}public static void main(String[] args) {System.out.println("NH]n;<pFEP2R4DYDw4Fsg^Z[gTHIx=e4H:hSEVtfR^SqsP]y[gK_:gIgvZccbUmj".hashCode());System.out.println("W@3Lb=SIr`\\h?KT5?ayLtd37y]x=\\Pcibr4O4SaKubhJ_M`lqEbjk;5ycYmZp^cm".hashCode());System.out.println("====================");HashCollide collide = new HashCollide(85, 7, 31);for (int i = 0; i < 10; ++i) {String a = collide.randomString(57);    //控制长度
//          String b = collide.collide(a, 912366222);String b = collide.collide(a, 123456);System.out.print(b);System.out.print("<==>");System.out.println(b.hashCode());if (b.hashCode() != 123456) {System.err.println("ERROR :: src = " + a);System.err.println("ERROR :: dst = " + b);System.exit(1);}}}
}

Java构建HashCode相同字符串算法相关推荐

  1. 数据结构与算法Java(二)——字符串、矩阵压缩、递归、动态规划

    不定期补充.修正.更新:欢迎大家讨论和指正 本文以数据结构(C语言版)第三版 李云清 杨庆红编著为主要参考资料,用Java来实现 数据结构与算法Java(一)--线性表 数据结构与算法Java(二)- ...

  2. c语言gga字符串校验和代码,一种新的Java智能卡上字节码校验算法.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava 一种新的Java智能卡上字节码校验算法.pdf4页 本 ...

  3. java 构建者模式_Java方法中的参数太多,第3部分:构建器模式

    java 构建者模式 在我的前两篇文章中,我研究了如何通过自定义类型和参数对象减少构造函数或方法调用所需的参数数量. 在本文中,我将讨论如何使用构建器模式来减少构造器所需的参数数量,并讨论该模式如何甚 ...

  4. 【java学习】String字符串

    1,概念 1)String 不可变 不可变类:final,不可被继承. public final class String implements java.io.Serializable, Compa ...

  5. Java数据结构第一讲-排序算法

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  6. java判断回文字符串几种简单的实现

    11年it研发经验,从一个会计转行为算法工程师,学过C#,c++,java,android,php,go,js,python,CNN神经网络,四千多篇博文,三千多篇原创,只为与你分享,共同成长,一起进 ...

  7. Java的GC机制及算法

    转载自   Java的GC机制及算法 GC的阶段  对每个对象而言,垃圾回收分为两个阶段:finalization和reclamation. finalization: 指运行这个对象的finaliz ...

  8. java对象序列化为字符串

    文章目录 1 场景 2 应用 2.1 过程描述 2.2 字节数组.字符串转换 2.2.1 hex转码 2.2.2 base64转码 2.3 对象序列化字节数组 2.3.1 使用commons-lang ...

  9. 大数据日知录_腾讯T4专家精心整理:java+大数据+机器学习+数据挖掘+算法大集结...

    前言 本篇文章总共八大部分组成,包括数据挖掘:概念.模型.方法和算法:大数据日知录:架构与算法:大数据算法:数据结构与算法经典问题解析:算法基础:打开算法之门:机器学习算法大集结:Java数据结构和算 ...

最新文章

  1. 福布斯2019全球最佳创投人榜单发布,沈南鹏蝉联全球第一
  2. VS2010强大的一塌糊涂
  3. source insight搜不到关联代码
  4. QTP- 对输入格式的检查
  5. php method_exists 检测类中是否包括函数
  6. 惠普大佬:未来30年四大趋势将推动科技产业发展
  7. 小知识-美元石油体系
  8. mysql 设置一个字段为null_MySQL中,为什么要设置NOT NULL?
  9. mysql5.7.14启动教程_mysql5.7.14安装配置方法图文详细教程
  10. Google Code 5岁啦!
  11. 手机抓直播源工具app_香港卫视 手机在线直播 央视源
  12. python3安装setuptools步骤_详解Python3中setuptools、Pip安装教程
  13. ping: www.baidu.com: 域名解析暂时失败 简单解决
  14. zuul+SpringSession的session不一致问题
  15. 云计算行业到了最危险的时刻
  16. html标签引入css样式的四种方式
  17. BetaFlight深入传感设计之六:四元数计算方法
  18. org.springframework.data.redis.RedisSystemException: Error in execution; nes遇到springboot连接Redis报错
  19. ORM框架——SqlSugar
  20. 404 not found nginx是什么意思_如何在BT面板基于nginx环境安装配置Perfex CRM网站

热门文章

  1. android 渠道方案,Android 不同渠道差异代码
  2. M1卡 不能使用KeyB进行读写的问题
  3. oracle dbms_repair,DBMS_REPAIR的使用
  4. Git使用教程,最详细
  5. August 21st 2016 Week 35th Sunday
  6. 智能门锁:电源管理概述2
  7. WaitForSingleObject与事件、信号量、互斥、临界区的用法
  8. ios游戏 java,Unity iOS游戏崩溃与NSInternalInconsistencyException
  9. 多大密西沙加计算机科学与技术,多伦多大学第二大校区——密西沙加校区专业及双录取介绍...
  10. 读薄《深入理解 Java 虚拟机》 JVM 的内存分配策略