package edu.brown.benchmark.ycsb.distributions; /** * 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. */ import java.util.Random; /** * Utility functions. */ public class Utils { private static final Random rand = new Random(); private static final ThreadLocal<Random> rng = new ThreadLocal<Random>(); public static Random random() { Random ret = rng.get(); if(ret == null) { ret = new Random(rand.nextLong()); rng.set(ret); } return ret; } /** * Generate a random ASCII string of a given length. */ public static String ASCIIString(int length) { int interval='~'-' '+1; byte []buf = new byte[length]; random().nextBytes(buf); for (int i = 0; i < length; i++) { if (buf[i] < 0) { buf[i] = (byte)((-buf[i] % interval) + ' '); } else { buf[i] = (byte)((buf[i] % interval) + ' '); } } return new String(buf); } /** * Hash an integer value. */ public static long hash(long val) { return FNVhash64(val); } public static final int FNV_offset_basis_32=0x811c9dc5; public static final int FNV_prime_32=16777619; /** * 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 FNVhash32(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; //hashval = hashval ^ octet; } return Math.abs(hashval); } public static final long FNV_offset_basis_64=0xCBF29CE484222325L; public static final long FNV_prime_64=1099511628211L; /** * 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 FNVhash64(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; //hashval = hashval ^ octet; } return Math.abs(hashval); } }