package squidpony.examples;
import squidpony.FakeLanguageGen;
import squidpony.squidgrid.Radius;
import squidpony.squidmath.*;
import java.util.Arrays;
/**
* Created by Tommy Ettinger on 8/15/2016.
*/
/*
Mixed-script strings: Ыνωплiam аσιοguι ζi ινыπλειtsαυ рæφes
JDK collisions, 32-bit: 146
FNV collisions, 32-bit: 134
Sip collisions, 32-bit: 129
Lit collisions, 32-bit: 125
English strings: Loorly sait nundeags jeefout; dug?
JDK collisions, 32-bit: 123
FNV collisions, 32-bit: 106
Sip collisions, 32-bit: 130
Lit collisions, 32-bit: 118
Japanese (Romanized) strings: Iyainyado su shaisou oyo rogyadedu?
JDK collisions, 32-bit: 113
FNV collisions, 32-bit: 116
Sip collisions, 32-bit: 128
Lit collisions, 32-bit: 113
Arabic (simplified, Romanized) strings: Akhrariid adhirzhaizh luju lari kuuramiit aih!
JDK collisions, 32-bit: 140
FNV collisions, 32-bit: 118
Sip collisions, 32-bit: 141
Lit collisions, 32-bit: 124
*/
public class HashQualityTest {
public static int jdkHash(char[] data, int start, int end)
{
char[] used = new char[end - start];
System.arraycopy(data, start, used, 0, used.length);
return Arrays.hashCode(used);
}
public static byte[] byteSection(byte[] data, int start, int end)
{
byte[] used = new byte[end - start];
System.arraycopy(data, start, used, 0, used.length);
return used;
}
//where this restrict is used, it will only use the bottom 16 bits and 8 alternating bits from the top of a hash
//public static final int restrict = 0x5555FFFF;
//where this restrict is used, it will use all bits of a hash
public static final int restrict = -1;
public static void main(String[] args)
{
CrossHash.Storm storm = CrossHash.Storm.chi;
CrossHash.Chariot chariot = CrossHash.Chariot.theta;
CrossHash.Mist mist = CrossHash.Mist.epsilon;
byte[][] bytes = {
null,
{},
{0}, {0, 0}, {0, 0, 0},
{1}, {1, 1}, {1, 1, 1},
{2}, {2, 2}, {2, 2, 2},
{3}, {3, 3}, {3, 3, 3},
{4}, {4, 4}, {4, 4, 4},
{5}, {5, 5}, {5, 5, 5},
{6}, {6, 6}, {6, 6, 6},
{7}, {7, 7}, {7, 7, 7},
{8}, {8, 8}, {8, 8, 8},
{31}, {31, 31}, {31, 31, 31},
{-1}, {-1, -1}, {-1, -1, -1},
{-2}, {-2, -2}, {-2, -2, -2},
{-3}, {-3, -3}, {-3, -3, -3},
{-4}, {-4, -4}, {-4, -4, -4},
{-5}, {-5, -5}, {-5, -5, -5},
{-6}, {-6, -6}, {-6, -6, -6},
{-7}, {-7, -7}, {-7, -7, -7},
{-8}, {-8, -8}, {-8, -8, -8},
{-31}, {-31, -31}, {-31, -31, -31},
{127}, {127, 127}, {127, 127, 127},
{-128}, {(byte)0xC0}, {(byte)0xF0},
};
short[][] shorts = {
null,
{},
{0}, {0, 0}, {0, 0, 0},
{1}, {1, 1}, {1, 1, 1},
{2}, {2, 2}, {2, 2, 2},
{3}, {3, 3}, {3, 3, 3},
{4}, {4, 4}, {4, 4, 4},
{5}, {5, 5}, {5, 5, 5},
{6}, {6, 6}, {6, 6, 6},
{7}, {7, 7}, {7, 7, 7},
{8}, {8, 8}, {8, 8, 8},
{31}, {31, 31}, {31, 31, 31},
{-1}, {-1, -1}, {-1, -1, -1},
{-2}, {-2, -2}, {-2, -2, -2},
{-3}, {-3, -3}, {-3, -3, -3},
{-4}, {-4, -4}, {-4, -4, -4},
{-5}, {-5, -5}, {-5, -5, -5},
{-6}, {-6, -6}, {-6, -6, -6},
{-7}, {-7, -7}, {-7, -7, -7},
{-8}, {-8, -8}, {-8, -8, -8},
{-31}, {-31, -31}, {-31, -31, -31},
{0x7fff}, {0x7fff, 0x7fff}, {0x7fff, 0x7fff, 0x7fff},
{-0x8000}, {(short)0xC000}, {(short)0xFF00},
};
int[][] ints = {
null,
{},
{0}, {0, 0}, {0, 0, 0},
{1}, {1, 1}, {1, 1, 1},
{2}, {2, 2}, {2, 2, 2},
{3}, {3, 3}, {3, 3, 3},
{4}, {4, 4}, {4, 4, 4},
{5}, {5, 5}, {5, 5, 5},
{6}, {6, 6}, {6, 6, 6},
{7}, {7, 7}, {7, 7, 7},
{8}, {8, 8}, {8, 8, 8},
{31}, {31, 31}, {31, 31, 31},
{-1}, {-1, -1}, {-1, -1, -1},
{-2}, {-2, -2}, {-2, -2, -2},
{-3}, {-3, -3}, {-3, -3, -3},
{-4}, {-4, -4}, {-4, -4, -4},
{-5}, {-5, -5}, {-5, -5, -5},
{-6}, {-6, -6}, {-6, -6, -6},
{-7}, {-7, -7}, {-7, -7, -7},
{-8}, {-8, -8}, {-8, -8, -8},
{-31}, {-31, -31}, {-31, -31, -31},
{0x7fffffff}, {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff, 0x7fffffff},
{0x80000000}, {0xC0000000}, {0xFF000000},
};
long[][] longs = {
null,
{},
{0}, {0, 0}, {0, 0, 0},
{1}, {1, 1}, {1, 1, 1},
{2}, {2, 2}, {2, 2, 2},
{3}, {3, 3}, {3, 3, 3},
{4}, {4, 4}, {4, 4, 4},
{5}, {5, 5}, {5, 5, 5},
{6}, {6, 6}, {6, 6, 6},
{7}, {7, 7}, {7, 7, 7},
{8}, {8, 8}, {8, 8, 8},
{31}, {31, 31}, {31, 31, 31},
{-1}, {-1, -1}, {-1, -1, -1},
{-2}, {-2, -2}, {-2, -2, -2},
{-3}, {-3, -3}, {-3, -3, -3},
{-4}, {-4, -4}, {-4, -4, -4},
{-5}, {-5, -5}, {-5, -5, -5},
{-6}, {-6, -6}, {-6, -6, -6},
{-7}, {-7, -7}, {-7, -7, -7},
{-8}, {-8, -8}, {-8, -8, -8},
{-31}, {-31, -31}, {-31, -31, -31},
{0x7fffffffffffffffL}, {0x7fffffffffffffffL, 0x7fffffffffffffffL}, {0x7fffffffffffffffL, 0x7fffffffffffffffL, 0x7fffffffffffffffL},
{0x8000000000000000L, 0x8000000000000000L, 0x8000000000000000L},
{0xC000000000000000L, 0xC000000000000000L, 0xC000000000000000L},
{0xFF00000000000000L, 0xFF00000000000000L, 0xFF00000000000000L},
};
Object[][] objects = {
null,
{},
{new OrderedSet<String>(2)},
{new OrderedSet<String>(2), new OrderedMap<String, String>(2)},
{new OrderedSet<String>(2), new OrderedMap<String, String>(2), new OrderedSet<String>(2)},
{new GreasedRegion()},
{new GreasedRegion(), new GreasedRegion()},
{new GreasedRegion(), new GreasedRegion(), new GreasedRegion()},
{new LightRNG(0)},
{new LightRNG(0), new LightRNG(0)},
{new LightRNG(0), new LightRNG(0), new LightRNG(0)},
{FakeLanguageGen.ENGLISH},
{FakeLanguageGen.ENGLISH, FakeLanguageGen.RUSSIAN_AUTHENTIC},
{FakeLanguageGen.ENGLISH, FakeLanguageGen.RUSSIAN_AUTHENTIC, FakeLanguageGen.GREEK_AUTHENTIC},
{new LongPeriodRNG(0)},
{new LongPeriodRNG(0), new LongPeriodRNG(0)},
{new LongPeriodRNG(0), new LongPeriodRNG(0), new LongPeriodRNG(0)},
{new ShortVLA()},
{new ShortVLA(), new ShortVLA()},
{new ShortVLA(), new ShortVLA(), new ShortVLA()},
{new IntVLA()},
{new IntVLA(), new IntVLA()},
{new IntVLA(), new IntVLA(), new IntVLA()},
{Radius.SQUARE},
{Radius.SQUARE, Radius.CIRCLE},
{Radius.SQUARE, Radius.CIRCLE, Radius.DIAMOND},
{new XoRoRNG(0)},
{new XoRoRNG(0), new XoRoRNG(0)},
{new XoRoRNG(0), new XoRoRNG(0), new XoRoRNG(0)},
{new SquidID(5, 5)},
{new SquidID(5, 5), new SquidID(5, 5)},
{new SquidID(5, 5), new SquidID(5, 5), new SquidID(5, 5)},
{new GreasedRegion(), new LightRNG(0)},
{new GreasedRegion(), new LightRNG(0), new GreasedRegion(), new LightRNG(0)},
{new GreasedRegion(), new LightRNG(0), new GreasedRegion(), new LightRNG(0), new GreasedRegion(), new LightRNG(0)},
{new LightRNG(0), FakeLanguageGen.ENGLISH},
{new LightRNG(0), FakeLanguageGen.ENGLISH, new LightRNG(0), FakeLanguageGen.RUSSIAN_AUTHENTIC},
{new LightRNG(0), FakeLanguageGen.ENGLISH, new LightRNG(0), FakeLanguageGen.RUSSIAN_AUTHENTIC, new LightRNG(0), FakeLanguageGen.GREEK_AUTHENTIC},
{FakeLanguageGen.ENGLISH, new LongPeriodRNG(0)},
{FakeLanguageGen.ENGLISH, new LongPeriodRNG(0), FakeLanguageGen.RUSSIAN_AUTHENTIC, new LongPeriodRNG(0)},
{FakeLanguageGen.ENGLISH, new LongPeriodRNG(0), FakeLanguageGen.RUSSIAN_AUTHENTIC, new LongPeriodRNG(0), FakeLanguageGen.GREEK_AUTHENTIC, new LongPeriodRNG(0)},
{new LongPeriodRNG(0), new ShortVLA()},
{new LongPeriodRNG(0), new ShortVLA(), new LongPeriodRNG(0), new ShortVLA()},
{new LongPeriodRNG(0), new ShortVLA(), new LongPeriodRNG(0), new ShortVLA(), new LongPeriodRNG(0), new ShortVLA()},
{new ShortVLA(), new IntVLA()},
{new ShortVLA(), new IntVLA(), new ShortVLA(), new IntVLA()},
{new ShortVLA(), new IntVLA(), new ShortVLA(), new IntVLA(), new ShortVLA(), new IntVLA()},
{new IntVLA(), Radius.SQUARE},
{new IntVLA(), Radius.SQUARE, new IntVLA(), Radius.CIRCLE},
{new IntVLA(), Radius.SQUARE, new IntVLA(), Radius.CIRCLE, new IntVLA(), Radius.DIAMOND},
{Radius.SQUARE, new XoRoRNG(0)},
{Radius.SQUARE, new XoRoRNG(0), Radius.CIRCLE, new XoRoRNG(0)},
{Radius.SQUARE, new XoRoRNG(0), Radius.CIRCLE, new XoRoRNG(0), Radius.DIAMOND, new XoRoRNG(0)},
{new XoRoRNG(0), new SquidID(5, 5)},
{new XoRoRNG(0), new SquidID(5, 5), new XoRoRNG(0), new SquidID(5, 5)},
{new XoRoRNG(0), new SquidID(5, 5), new XoRoRNG(0), new SquidID(5, 5), new XoRoRNG(0), new SquidID(5, 5)},
{new SquidID(5, 5), null},
{new SquidID(5, 5), null, new SquidID(5, 5), null},
{new SquidID(5, 5), null, new SquidID(5, 5), null, new SquidID(5, 5), null},
{Coord.get(0, 0)}, {Coord.get(0, 0), Coord.get(0, 0)}, {Coord.get(0, 0), Coord.get(0, 0), Coord.get(0, 0)},
{Coord.get(-1, -1)}, {Coord.get(-1, -1), Coord.get(-1, -1)}, {Coord.get(-1, -1), Coord.get(-1, -1), Coord.get(-1, -1)},
};
int len = bytes.length;
for (int i = 0; i < len; i++) {
System.out.println(Arrays.toString(longs[i]));
System.out.println("JDK bytes: " + Arrays.hashCode(bytes[i]));
System.out.println("JDK shorts: " + Arrays.hashCode(shorts[i]));
System.out.println("JDK ints: " + Arrays.hashCode(ints[i]));
System.out.println("JDK longs: " + Arrays.hashCode(longs[i]));
System.out.println("JDK objects: " + Arrays.hashCode(objects[i]));
}
for (int i = 0; i < len; i++) {
System.out.println(Arrays.toString(longs[i]));
System.out.println("CrossHash bytes: " + CrossHash.hash(bytes[i]));
System.out.println("CrossHash shorts: " + CrossHash.hash(shorts[i]));
System.out.println("CrossHash ints: " + CrossHash.hash(ints[i]));
System.out.println("CrossHash longs: " + CrossHash.hash(longs[i]));
}
for (int i = 0; i < len; i++) {
System.out.println(Arrays.toString(longs[i]));
System.out.println("Lightning bytes: " + CrossHash.Lightning.hash(bytes[i]));
System.out.println("Lightning shorts: " + CrossHash.Lightning.hash(shorts[i]));
System.out.println("Lightning ints: " + CrossHash.Lightning.hash(ints[i]));
System.out.println("Lightning longs: " + CrossHash.Lightning.hash(longs[i]));
System.out.println("Lightning objects: " + CrossHash.Lightning.hash(objects[i]));
}
for (int i = 0; i < len; i++) {
System.out.println(Arrays.toString(longs[i]));
System.out.println("Storm bytes: " + storm.hash(bytes[i]));
System.out.println("Storm shorts: " + storm.hash(shorts[i]));
System.out.println("Storm ints: " + storm.hash(ints[i]));
System.out.println("Storm longs: " + storm.hash(longs[i]));
System.out.println("Storm objects: " + storm.hash(objects[i]));
}
for (int i = 0; i < len; i++) {
System.out.println(Arrays.toString(longs[i]));
System.out.println("Falcon bytes: " + CrossHash.Falcon.hash(bytes[i]));
System.out.println("Falcon shorts: " + CrossHash.Falcon.hash(shorts[i]));
System.out.println("Falcon ints: " + CrossHash.Falcon.hash(ints[i]));
System.out.println("Falcon longs: " + CrossHash.Falcon.hash(longs[i]));
System.out.println("Falcon objects: " + CrossHash.Falcon.hash(objects[i]));
}
for (int i = 0; i < len; i++) {
System.out.println(Arrays.toString(longs[i]));
System.out.println("Chariot bytes: " + chariot.hash(bytes[i]));
System.out.println("Chariot shorts: " + chariot.hash(shorts[i]));
System.out.println("Chariot ints: " + chariot.hash(ints[i]));
System.out.println("Chariot longs: " + chariot.hash(longs[i]));
System.out.println("Chariot objects: " + chariot.hash(objects[i]));
}
for (int i = 0; i < len; i++) {
System.out.println(Arrays.toString(longs[i]));
System.out.println("Wisp bytes: " + CrossHash.Wisp.hash(bytes[i]));
System.out.println("Wisp shorts: " + CrossHash.Wisp.hash(shorts[i]));
System.out.println("Wisp ints: " + CrossHash.Wisp.hash(ints[i]));
System.out.println("Wisp longs: " + CrossHash.Wisp.hash(longs[i]));
System.out.println("Wisp objects: " + CrossHash.Wisp.hash(objects[i]));
}
for (int i = 0; i < len; i++) {
System.out.println(Arrays.toString(longs[i]));
System.out.println("Mist bytes: " + mist.hash(bytes[i]));
System.out.println("Mist shorts: " + mist.hash(shorts[i]));
System.out.println("Mist ints: " + mist.hash(ints[i]));
System.out.println("Mist longs: " + mist.hash(longs[i]));
System.out.println("Mist objects: " + mist.hash(objects[i]));
}
int longHashLength = 0x80000, stringHashLength = 0xC0000;
IntDoubleOrderedMap colliderJDK = new IntDoubleOrderedMap(longHashLength, 0.75f),
colliderFNV = new IntDoubleOrderedMap(longHashLength, 0.75f),
colliderLit = new IntDoubleOrderedMap(longHashLength, 0.75f),
colliderSto = new IntDoubleOrderedMap(longHashLength, 0.75f),
colliderFal = new IntDoubleOrderedMap(longHashLength, 0.75f),
colliderWis = new IntDoubleOrderedMap(longHashLength, 0.75f),
colliderCha = new IntDoubleOrderedMap(longHashLength, 0.75f),
colliderMis = new IntDoubleOrderedMap(longHashLength, 0.75f);
LongPeriodRNG lprng = new LongPeriodRNG();
System.out.println("Long Hashing:");
System.out.println("---------------------------------");
for (int bits = 16, mask = 0xFFFF; bits < 33; mask |= 1 << bits++) {
lprng.reseed(0x66L);
for (int i = 0; i < longHashLength; i++) {
lprng.nextLong();
colliderJDK.put(Arrays.hashCode(lprng.state) & mask, i);
colliderFNV.put(CrossHash.hash(lprng.state) & mask, i);
colliderLit.put(CrossHash.Lightning.hash(lprng.state) & mask, i);
colliderSto.put(storm.hash(lprng.state) & mask, i);
colliderFal.put(CrossHash.Falcon.hash(lprng.state) & mask, i);
colliderWis.put(CrossHash.Wisp.hash(lprng.state) & mask, i);
colliderCha.put(chariot.hash(lprng.state) & mask, i);
colliderMis.put(mist.hash(lprng.state) & mask, i);
}
System.out.println("JDK collisions, " + bits + "-bit: " + (longHashLength - colliderJDK.size()));
System.out.println("FNV collisions, " + bits + "-bit: " + (longHashLength - colliderFNV.size()));
System.out.println("Lit collisions, " + bits + "-bit: " + (longHashLength - colliderLit.size()));
System.out.println("Sto collisions, " + bits + "-bit: " + (longHashLength - colliderSto.size()));
System.out.println("Fal collisions, " + bits + "-bit: " + (longHashLength - colliderFal.size()));
System.out.println("Wis collisions, " + bits + "-bit: " + (longHashLength - colliderWis.size()));
System.out.println("Cha collisions, " + bits + "-bit: " + (longHashLength - colliderCha.size()));
System.out.println("Mis collisions, " + bits + "-bit: " + (longHashLength - colliderMis.size()));
System.out.println();
colliderJDK.clear();
colliderFNV.clear();
colliderLit.clear();
colliderSto.clear();
colliderFal.clear();
colliderWis.clear();
colliderCha.clear();
colliderMis.clear();
}
System.out.println("\nString Hashing:");
System.out.println("---------------------------------");
StatefulRNG srng = new StatefulRNG(0x1337CAFE);
String input;
FakeLanguageGen oddLang;
String[] midPunct = {",", ";", " -"}, endPunct = {"..."};
char[] massive;
int langLength;
System.out.println("Arabic-ish text, Romanized");
srng.setState(0x1337CAFE);
oddLang = FakeLanguageGen.ARABIC_ROMANIZED.addModifiers(FakeLanguageGen.Modifier.SIMPLIFY_ARABIC);
massive = oddLang.sentence(srng, 0x50000,0x50100, midPunct, endPunct, 0.3).toCharArray();
langLength = massive.length;
for (int i = 0, s = 0, e = 0; i < stringHashLength && s + 290 < langLength; i++, e = ((e+3) & 0x1ff)) {
colliderJDK.put(jdkHash(massive, s, s+e+32) & restrict, i);
colliderFNV.put(CrossHash.hash(massive, s, s+e+32) & restrict, i);
colliderLit.put(CrossHash.Lightning.hash(massive, s, s+e+32) & restrict, i);
colliderSto.put(storm.hash(massive, s, s+e+32) & restrict, i);
colliderFal.put(CrossHash.Falcon.hash(massive, s, s+e+32) & restrict, i);
colliderWis.put(CrossHash.Wisp.hash(massive, s, s+e+32) & restrict, i);
colliderCha.put(chariot.hash(massive, s, s+e+32) & restrict, i);
colliderMis.put(mist.hash(massive, s, s+e+32) & restrict, i);
if(e >= 0x1fd)
s += 7;
}
System.out.println("JDK collisions, 32-bit: " + (stringHashLength - colliderJDK.size()));
System.out.println("FNV collisions, 32-bit: " + (stringHashLength - colliderFNV.size()));
System.out.println("Lit collisions, 32-bit: " + (stringHashLength - colliderLit.size()));
System.out.println("Sto collisions, 32-bit: " + (stringHashLength - colliderSto.size()));
System.out.println("Fal collisions, 32-bit: " + (stringHashLength - colliderFal.size()));
System.out.println("Wis collisions, 32-bit: " + (stringHashLength - colliderWis.size()));
System.out.println("Cha collisions, 32-bit: " + (stringHashLength - colliderCha.size()));
System.out.println("Mis collisions, 32-bit: " + (stringHashLength - colliderMis.size()));
System.out.println();
colliderJDK.clear();
colliderFNV.clear();
colliderLit.clear();
colliderSto.clear();
colliderFal.clear();
colliderWis.clear();
colliderCha.clear();
colliderMis.clear();
System.out.println("Japanese-ish text, Romanized");
srng.setState(0x1337CAFE);
oddLang = FakeLanguageGen.JAPANESE_ROMANIZED;
massive = oddLang.sentence(srng, 0x50000,0x50100, midPunct, endPunct, 0.3).toCharArray();
langLength = massive.length;
for (int i = 0, s = 0, e = 0; i < stringHashLength && s + 290 < langLength; i++, e = ((e+3) & 0x1ff)) {
colliderJDK.put(jdkHash(massive, s, s+e+32) & restrict, i);
colliderFNV.put(CrossHash.hash(massive, s, s+e+32) & restrict, i);
colliderLit.put(CrossHash.Lightning.hash(massive, s, s+e+32) & restrict, i);
colliderSto.put(storm.hash(massive, s, s+e+32) & restrict, i);
colliderFal.put(CrossHash.Falcon.hash(massive, s, s+e+32) & restrict, i);
colliderWis.put(CrossHash.Wisp.hash(massive, s, s+e+32) & restrict, i);
colliderCha.put(chariot.hash(massive, s, s+e+32) & restrict, i);
colliderMis.put(mist.hash(massive, s, s+e+32) & restrict, i);
if(e >= 0x1fd)
s += 7;
}
System.out.println("JDK collisions, 32-bit: " + (stringHashLength - colliderJDK.size()));
System.out.println("FNV collisions, 32-bit: " + (stringHashLength - colliderFNV.size()));
System.out.println("Lit collisions, 32-bit: " + (stringHashLength - colliderLit.size()));
System.out.println("Sto collisions, 32-bit: " + (stringHashLength - colliderSto.size()));
System.out.println("Fal collisions, 32-bit: " + (stringHashLength - colliderFal.size()));
System.out.println("Wis collisions, 32-bit: " + (stringHashLength - colliderWis.size()));
System.out.println("Cha collisions, 32-bit: " + (stringHashLength - colliderCha.size()));
System.out.println("Mis collisions, 32-bit: " + (stringHashLength - colliderMis.size()));
System.out.println();
colliderJDK.clear();
colliderFNV.clear();
colliderLit.clear();
colliderSto.clear();
colliderFal.clear();
colliderWis.clear();
colliderCha.clear();
colliderMis.clear();
System.out.println("Unicode-heavy fantasy text");
srng.setState(0x1337CAFE);
oddLang = FakeLanguageGen.FANCY_FANTASY_NAME.mix(FakeLanguageGen.GREEK_AUTHENTIC, 0.67).mix(FakeLanguageGen.RUSSIAN_AUTHENTIC, 0.45);
String hugeSentence = oddLang.sentence(srng, 0x50000,0x50100, midPunct, endPunct, 0.3);
massive = hugeSentence.toCharArray();
langLength = massive.length;
for (int i = 0, s = 0, e = 0; i < stringHashLength && s + 290 < langLength; i++, e = ((e+3) & 0x1ff)) {
colliderJDK.put(jdkHash(massive, s, s+e+32) & restrict, i);
colliderFNV.put(CrossHash.hash(massive, s, s+e+32) & restrict, i);
colliderLit.put(CrossHash.Lightning.hash(massive, s, s+e+32) & restrict, i);
colliderSto.put(storm.hash(massive, s, s+e+32) & restrict, i);
colliderFal.put(CrossHash.Falcon.hash(massive, s, s+e+32) & restrict, i);
colliderWis.put(CrossHash.Wisp.hash(massive, s, s+e+32) & restrict, i);
colliderCha.put(chariot.hash(massive, s, s+e+32) & restrict, i);
colliderMis.put(mist.hash(massive, s, s+e+32) & restrict, i);
if(e >= 0x1fd)
s += 7;
}
System.out.println("JDK collisions, 32-bit: " + (stringHashLength - colliderJDK.size()));
System.out.println("FNV collisions, 32-bit: " + (stringHashLength - colliderFNV.size()));
System.out.println("Lit collisions, 32-bit: " + (stringHashLength - colliderLit.size()));
System.out.println("Sto collisions, 32-bit: " + (stringHashLength - colliderSto.size()));
System.out.println("Fal collisions, 32-bit: " + (stringHashLength - colliderFal.size()));
System.out.println("Wis collisions, 32-bit: " + (stringHashLength - colliderWis.size()));
System.out.println("Cha collisions, 32-bit: " + (stringHashLength - colliderCha.size()));
System.out.println("Mis collisions, 32-bit: " + (stringHashLength - colliderMis.size()));
System.out.println();
colliderJDK.clear();
colliderFNV.clear();
colliderLit.clear();
colliderSto.clear();
colliderFal.clear();
colliderWis.clear();
colliderCha.clear();
colliderMis.clear();
System.out.println("English text");
srng.setState(0x1337CAFE);
oddLang = FakeLanguageGen.ENGLISH;
massive = oddLang.sentence(srng, 0x50000,0x50100, midPunct, endPunct, 0.3).toCharArray();
langLength = massive.length;
for (int i = 0, s = 0, e = 0; i < stringHashLength && s + 290 < langLength; i++, e = ((e+3) & 0x1ff)) {
colliderJDK.put(jdkHash(massive, s, s+e+32) & restrict, i);
colliderFNV.put(CrossHash.hash(massive, s, s+e+32) & restrict, i);
colliderLit.put(CrossHash.Lightning.hash(massive, s, s+e+32) & restrict, i);
colliderSto.put(storm.hash(massive, s, s+e+32) & restrict, i);
colliderFal.put(CrossHash.Falcon.hash(massive, s, s+e+32) & restrict, i);
colliderWis.put(CrossHash.Wisp.hash(massive, s, s+e+32) & restrict, i);
colliderCha.put(chariot.hash(massive, s, s+e+32) & restrict, i);
colliderMis.put(mist.hash(massive, s, s+e+32) & restrict, i);
if(e >= 0x1fd)
s += 7;
}
System.out.println("JDK collisions, 32-bit: " + (stringHashLength - colliderJDK.size()));
System.out.println("FNV collisions, 32-bit: " + (stringHashLength - colliderFNV.size()));
System.out.println("Lit collisions, 32-bit: " + (stringHashLength - colliderLit.size()));
System.out.println("Sto collisions, 32-bit: " + (stringHashLength - colliderSto.size()));
System.out.println("Fal collisions, 32-bit: " + (stringHashLength - colliderFal.size()));
System.out.println("Wis collisions, 32-bit: " + (stringHashLength - colliderWis.size()));
System.out.println("Cha collisions, 32-bit: " + (stringHashLength - colliderCha.size()));
System.out.println("Mis collisions, 32-bit: " + (stringHashLength - colliderMis.size()));
System.out.println();
colliderJDK.clear();
colliderFNV.clear();
colliderLit.clear();
colliderSto.clear();
colliderFal.clear();
colliderWis.clear();
colliderCha.clear();
colliderMis.clear();
/*
System.out.println("Unicode fantasy as UTF-8 bytes");
byte[] massiveBytes = hugeSentence.getBytes(StandardCharsets.UTF_8), section;
langLength = massiveBytes.length;
for (int i = 0, s = 0, e = 0; i < stringHashLength && s + 290 < langLength; i++, e = ((e+3) & 0x1ff)) {
section = byteSection(massiveBytes, s, s+e+32);
colliderJDK.put(jdkHash(massive, s, s+e+32) & restrict, i);
colliderFNV.put(CrossHash.hash(massive, s, s+e+32) & restrict, i);
colliderLit.put(CrossHash.Lightning.hash(massive, s, s+e+32) & restrict, i);
colliderSto.put(storm.hash(massive, s, s+e+32) & restrict, i);
colliderFal.put(CrossHash.Falcon.hash(massive, s, s+e+32) & restrict, i);
colliderWis.put(CrossHash.Wisp.hash(massive, s, s+e+32) & restrict, i);
if(e >= 0x1fd)
s += 7;
}
System.out.println("JDK collisions, 32-bit: " + (stringHashLength - colliderJDK.size()));
System.out.println("FNV collisions, 32-bit: " + (stringHashLength - colliderFNV.size()));
System.out.println("Lit collisions, 32-bit: " + (stringHashLength - colliderLit.size()));
System.out.println("Sto collisions, 32-bit: " + (stringHashLength - colliderSto.size()));
System.out.println("Fal collisions, 32-bit: " + (stringHashLength - colliderFal.size()));
System.out.println("Wis collisions, 32-bit: " + (stringHashLength - colliderWis.size()));
System.out.println();
colliderJDK.clear();
colliderFNV.clear();
colliderLit.clear();
colliderSto.clear();
colliderFal.clear();
colliderWis.clear();
*/
}
}