/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.presto.util; import java.util.Random; /** * Utility class used to generate hash collision estimates. */ public final class HashCollisionsSimulator { private static final int NUMBER_OF_ESTIMATES = 500; private static final int NUMBER_OF_PROBES = 500; private static final int NUMBER_OF_VALUES = 10000; public static void main(String[] args) { generateEstimates(); } private static void generateEstimates() { System.out.print("0.0, "); for (int i = 1; i <= NUMBER_OF_ESTIMATES; ++i) { int hashSize = NUMBER_OF_VALUES * NUMBER_OF_ESTIMATES / i; System.out.print(simulate(NUMBER_OF_VALUES, hashSize)); if (i < NUMBER_OF_ESTIMATES) { System.out.print(", "); } } } private static double simulate(int numberOfValues, int hashSize) { int collisions = 0; for (int i = 0; i < NUMBER_OF_PROBES; ++i) { collisions += simulationIteration(numberOfValues, hashSize); } return (double) collisions / NUMBER_OF_PROBES; } public static double simulate(int numberOfValues, int hashSize, int iterations) { int collisions = 0; for (int i = 0; i < iterations; ++i) { collisions += simulationIteration(numberOfValues, hashSize); } return (double) collisions / iterations; } private static int simulationIteration(int numberOfValues, int hashSize) { int collisions = 0; Random random = new Random(); boolean[] cells = new boolean[hashSize]; for (int i = 0; i < numberOfValues; ++i) { int pos = random.nextInt(hashSize); while (cells[pos]) { collisions++; pos = (pos + 1) % hashSize; } cells[pos] = true; } return collisions; } private HashCollisionsSimulator() {} }