package com.alibaba.json.test; import junit.framework.TestCase; import java.text.NumberFormat; import java.util.Random; /** * Created by wenshao on 08/01/2017. */ public class FNV32_CollisionTest_2 extends TestCase { char[] digLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_".toCharArray(); //char[] digLetters = "0123456789".toCharArray(); Random r = new Random(); int[] powers = new int[10]; { for (int i = 0; i < powers.length; ++i) { powers[i] = (int) Math.pow(digLetters.length, i); } } public void test_fnv_hash_7() throws Exception { int COUNT = 1000 * 1000 * 1000; long id_hash_64 = fnv_hash("name".toCharArray()); int id_hash_32 = (int) id_hash_64; System.out.println("name : " + id_hash_32 + ", " + id_hash_64); long v = 0; long time = System.currentTimeMillis(); NumberFormat format = NumberFormat.getInstance(); final int len = 7; char[] chars = new char[len]; for (int i0 = 0; i0 < digLetters.length; ++i0) { long h0 = 0x811c9dc5; char c0 = digLetters[i0]; h0 ^= c0; h0 *= 0x1000193; chars[0] = c0; for (int i1 = 0; i1 < digLetters.length; ++i1) { char c1 = digLetters[i1]; chars[1] = c1; long h1 = h0; h1 ^= c1; h1 *= 0x1000193; for (int i2 = 0; i2 < digLetters.length; ++i2) { char c2 = digLetters[i2]; long h2 = h1; h2 ^= c2; h2 *= 0x1000193; chars[2] = c2; for (int i3 = 0; i3 < digLetters.length; ++i3) { char c3 = digLetters[i3]; long h3 = h2; h3 ^= c3; h3 *= 0x1000193; chars[3] = c3; for (int i4 = 0; i4 < digLetters.length; ++i4) { char c4 = digLetters[i4]; long h4 = h3; h4 ^= c4; h4 *= 0x1000193; chars[4] = c4; for (int i5 = 0; i5 < digLetters.length; ++i5) { char c5 = digLetters[i5]; chars[5] = c5; long h5 = h4; h5 ^= c5; h5 *= 0x1000193; for (int i6 = 0; i6 < digLetters.length; ++i6) { char c6 = digLetters[i6]; long h6 = h5; h6 ^= c6; h6 *= 0x1000193; chars[6] = c6; v++; if (h6 == id_hash_64) { int hash_32 = (int) h6; System.out.println("collision : " + build(v, len) + ", hash64 : " + h6 + ", hash 32 " + hash_32); break; } if (v != 0 && v % (1000 * 1000 * 1000) == 0) { long now = System.currentTimeMillis(); long millis = now - time; time = now; System.out.println("millis : " + millis + ", " + format.format(v)); } } } } } } } } System.out.println("end : " + len); } String build(long v, int len) { char[] chars = new char[len]; for (int i = 0; i < chars.length; ++i) { int power = powers[chars.length - i - 1]; int d = (int) ((v / power) % digLetters.length); chars[i] = digLetters[d]; } return new String(chars); } static long fnv_hash(char[] chars) { long hash = 0x811c9dc5; for (int i = 0; i < chars.length; ++i) { char c = chars[i]; hash ^= c; hash *= 0x1000193; } return hash; } static long hash(char[] chars) { long hash = 0; for (int i = 0; i < chars.length; ++i) { hash = 31 * hash + chars[i]; } return hash; } }