package de.axone.cache.ng; import java.util.Random; /** * Maps i -> random(i) * so that it's a stable mapping. * * @author flo */ public class RandomMapper { private static final long multiplier = 0x5DEECE66DL; private static final long addend = 0xBL; private static final long mask = (1L << 48) - 1; static int integerUsingRandom( int value ){ Random rng = new Random( value ); rng.nextInt(); // shuffle rng.nextInt(); return rng.nextInt(); } public static int integer( int value ){ // initial scramble long seed = (value ^ multiplier) & mask; // shuffle three times. This is like rng.nextInt() seed = (seed * multiplier + addend) & mask; seed = (seed * multiplier + addend) & mask; seed = (seed * multiplier + addend) & mask; // fit size return (int)(seed >>> 16); } public static int positiveInteger( int value ){ return Math.abs( integer( value ) ); } }