- 浏览: 587840 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (213)
- jdk (40)
- J2EE (8)
- JavaScript (16)
- spring (1)
- 正则 (10)
- ORACLE (18)
- CSS (1)
- 生活学习 (14)
- XML (3)
- Linux (11)
- 项目架设 (12)
- Junit (1)
- Derby (3)
- JMX (5)
- 版本控制 (4)
- PowerDesigner (1)
- 加密解密 (1)
- android (4)
- Eclipse (4)
- Hibernate (6)
- Tomcat (4)
- JasperReport&iReport (1)
- SqlServer (6)
- C++ (3)
- 系统架构涉及名词解释 (5)
- Hadoop (8)
- windows (2)
- SOA (1)
- 有趣的Google (1)
- 编程语言 (0)
- 数据结构与算法 (1)
- nodejs (1)
- 一些测试整理备份在这里吧 (0)
- 性能 (3)
- Drill (5)
- 学习 (1)
最新评论
import java.math.BigDecimal; import java.util.Random; /** “中间相遇法”是生日攻击的一种变形,它不比较Hash值,而是比较链中的中间变量。这种攻击主要适用于攻击具有分组链结构的Hash方案。中间相遇攻击的基本原理为:将消息分成两部分,对伪造消息的第一部分从初试值开始逐步向中间阶段产生r1个变量;对伪造消息的第二部分从Hash结果开始逐步退回中间阶段产生r2个变量。在中间阶段有一个匹配的概率与生日攻击成功的概率一样。 */ 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应该不会小于0 val += 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 < 10000; ++i) { String a = collide.randomString(57); String b = collide.collide(a, 912366222); System.out.println(b); if (b.hashCode() != 912366222) { System.err.println("ERROR :: src = " + a); System.err.println("ERROR :: dst = " + b); System.exit(1); } } }
JDK String.hashCode()
/** * Returns a hash code for this string. The hash code for a * <code>String</code> object is computed as * <blockquote><pre> * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] * </pre></blockquote> * using <code>int</code> arithmetic, where <code>s[i]</code> is the * <i>i</i>th character of the string, <code>n</code> is the length of * the string, and <code>^</code> indicates exponentiation. * (The hash value of the empty string is zero.) * * @return a hash code value for this object. */ public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; //31 上文构造方法参数mulBase } hash = h; } return h; }
发表评论
-
关于饿汉式单例首次初始化失败后,可以再次尝试?
2012-07-11 15:14 1216思考一个问题,以下代码是一个简单的饿汉式单例代码,显然在第一次 ... -
由ApacheCommon-BeanUtils1.8.3发现的Java HotSpot(TM)的Bug
2012-07-03 15:42 1554由ApacheCommon-BeanUtils1.8.3发现的 ... -
JVM垃圾回收
2012-04-19 13:02 3492一、JVM内存模型及垃圾收集算法 1.根据Java虚 ... -
线程全部结束与集合点
2011-11-12 16:26 1223final int size = 50; fin ... -
ddddddddd
2011-11-12 16:21 1193dddddddddd -
ccccccc
2011-11-12 16:20 1809ccccccccccc -
bbbbbb
2011-11-12 16:19 1673bbbbb -
Aaaaa
2011-11-12 16:19 890aaaaaaaa -
备忘链接
2011-08-16 18:25 923翻译,随便写了写,备忘一下 URLConnection co ... -
jvisualvm监听JVM
2011-08-05 10:14 1182配置好 set JAVA_OPTS=%JAVA_OPTS ... -
JVM 调优 技巧
2011-08-02 15:59 12251.升级 JVM 版本。如果能使用64-bit,使用64-bi ... -
JVM垃圾回收策略
2011-08-02 14:59 1029为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不 ... -
Java GC
2011-08-02 13:38 1024调整JVM GC(Garbage Collection),可 ... -
Java的弱引用(Weak Reference)
2011-05-18 16:07 1224要理解弱引用,首先要 ... -
使用classloader动态加载Class
2011-05-17 14:25 934http://www.javaworld.com/javawo ... -
查看class文件信息
2011-05-16 14:15 1672看了第6章的java class文件这一部分,我觉得对clas ... -
.class文件格式--java字节码文件的格式
2011-05-14 23:07 25221 . 目的 Java 虚拟机识别的 class 文件格式包含 ... -
Calendar
2011-03-30 14:13 1023/**获得参数月份的一号及其下一个月的一号*/ priva ... -
Bad version number in .class file
2011-03-04 15:08 1314java.lang.UnsupportedClassVersi ... -
Java反射之:判断修饰符
2010-12-24 11:36 2576import java.lang.reflect.Modifi ...
相关推荐
HashCode相同equals不同的2位字符集合算法 另附ASCII码表
在java中一个hashCode算法,可以用来计算一个字符串的hash值,今天一个朋友突然问俺能不能在js中计算hashCode,要求和java的hashCode计算结果一样。 对于java的hashCode,以前到现在也一直没有了解过其算法,不过...
主要给大家介绍了关于Java中HashCode方法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要介绍了java 中HashCode重复的可能性的相关资料,这里提供实例及测试代码,需要的朋友可以参考下
java中Hashcode的作用
实际上,hashcode根本不能代表object的内存地址。
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
NULL 博文链接:https://songjianyong.iteye.com/blog/1676894
java中hashcode和equals的详解.pdf
Java基础加强_ArrayList_HashSet的比较及Hashcode分析
java中hashcode()和equals()的详解.docx
java中的哈希算法和hashcode深入讲解1
字符串哈希码 字符串的其他实用程序。安装npm install string-...原料药hashCode(str)参数: str:字符串对象返回: 编号:哈希码返回字符串的哈希码。 请注意,哈希码对于特定字符串是不可变的。执照麻省理工学院
在Java应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上equals比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需...
NULL 博文链接:https://zpointer.iteye.com/blog/1058337
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用以及equals()和==的区别,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。总的来说,Java中的集合(Collection)有两类,...
主要介绍了Java 中HashCode作用以及hashcode对于一个对象的重要性,对java中hashcode的作用相关知识感兴趣的朋友一起学习吧