package com.alibaba.json.test;
import junit.framework.TestCase;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.FilterWriter;
import java.text.NumberFormat;
import java.util.BitSet;
import java.util.Random;
/**
* Created by wenshao on 08/01/2017.
*/
public class FNV32_CollisionTest_All 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);
}
}
private BitSet[] bits = new BitSet[16];
private File file = new File("/Users/wenshao/Downloads/fnv/hash.bin");
FileOutputStream out;
protected void setUp() throws Exception {
out = new FileOutputStream(file);
for (int i = 0; i < bits.length; ++i) {
bits[i] = new BitSet(Integer.MAX_VALUE);
}
}
protected void tearDown() throws Exception {
out.close();
}
public void test_fnv_hash() throws Exception {
int collisionCount = 0;
long id_hash_64 = fnv_hash("name".toCharArray());
int id_hash_32 = Math.abs((int) id_hash_64);
//bitset.set(id_hash_32);
long v = 0;
long time = System.currentTimeMillis();
NumberFormat format = NumberFormat.getInstance();
byte[] b = new byte[8];
for (int len = 1; len <= 5; ++len){
char[] chars = new char[len];
long n = (long) Math.pow(digLetters.length, chars.length);
for (; v < n; ++v) {
long hash = 0x811c9dc5;
for (int i = 0; i < chars.length; ++i) {
int power = powers[chars.length - i - 1];
int d = (int) ((v / power) % digLetters.length);
char c = digLetters[d];
hash ^= c;
hash *= 0x1000193;
}
b[7] = (byte) (hash );
b[6] = (byte) (hash >>> 8);
b[5] = (byte) (hash >>> 16);
b[4] = (byte) (hash >>> 24);
b[3] = (byte) (hash >>> 32);
b[2] = (byte) (hash >>> 40);
b[1] = (byte) (hash >>> 48);
b[0] = (byte) (hash >>> 56);
out.write(b);
if (v != 0 && v % (1000 * 1000 * 10) == 0) {
long now = System.currentTimeMillis();
long millis = now - time;
time = now;
System.out.println("millis : " + millis + ", collision " + format.format(collisionCount) + ", " + 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;
}
}