All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.simulator.tests.map.helpers.ZipfianUtils Maven / Gradle / Ivy

/**
 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
 *
 * 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. See accompanying
 * LICENSE file.
 */
package com.hazelcast.simulator.tests.map.helpers;

import java.util.Random;

/**
 * Utility functions for zipfian generators.
 */
@SuppressWarnings("unused")
final class ZipfianUtils {

    private static final int FNV_OFFSET_BASIS_32 = 0x811c9dc5;
    private static final int FNV_PRIME_32 = 16777619;

    private static final long FNV_OFFSET_BASIS_64 = 0xCBF29CE484222325L;
    private static final long FNV_PRIME_64 = 1099511628211L;

    private static final Random RANDOM = new Random();
    private static final ThreadLocal THREAD_LOCAL_RANDOM = new ThreadLocal<>();

    private ZipfianUtils() {
    }

    public static Random random() {
        Random random = THREAD_LOCAL_RANDOM.get();
        if (random == null) {
            random = new Random(RANDOM.nextLong());
            THREAD_LOCAL_RANDOM.set(random);
        }
        return random;
    }

    /**
     * Generate a random ASCII string of a given length.
     */
    public static String generateASCIIString(int length) {
        int interval = '~' - ' ' + 1;

        byte[] buffer = new byte[length];
        random().nextBytes(buffer);
        for (int i = 0; i < length; i++) {
            if (buffer[i] < 0) {
                buffer[i] = (byte) ((-buffer[i] % interval) + ' ');
            } else {
                buffer[i] = (byte) ((buffer[i] % interval) + ' ');
            }
        }
        return new String(buffer);
    }

    /**
     * Hash an integer value.
     */
    public static long hash(long val) {
        return hashFNV64(val);
    }

    /**
     * 32 bit FNV hash. Produces more "random" hashes than (say) String.hashCode().
     *
     * @param val The value to hash.
     * @return The hash value
     */
    public static int hashFNV32(int val) {
        // from http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
        int hashVal = FNV_OFFSET_BASIS_32;

        for (int i = 0; i < 4; i++) {
            int octet = val & 0x00ff;
            val = val >> 8;

            hashVal = hashVal ^ octet;
            hashVal = hashVal * FNV_PRIME_32;
        }
        return Math.abs(hashVal);
    }

    /**
     * 64 bit FNV hash. Produces more "random" hashes than (say) String.hashCode().
     *
     * @param val The value to hash.
     * @return The hash value
     */
    public static long hashFNV64(long val) {
        // from http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
        long hashVal = FNV_OFFSET_BASIS_64;

        for (int i = 0; i < 8; i++) {
            long octet = val & 0x00ff;
            val = val >> 8;

            hashVal = hashVal ^ octet;
            hashVal = hashVal * FNV_PRIME_64;
        }
        return Math.abs(hashVal);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy