// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.math.util;

import javax.annotation.Nonnull;
import java.util.UUID;

public class HashUtil
{
    public static long hash(long v) {
        v = (v >>> 30 ^ v) * -4658895280553007687L;
        v = (v >>> 27 ^ v) * -7723592293110705685L;
        v ^= v >>> 31;
        return v;
    }
    
    public static long hash(long l1, final long l2) {
        l1 = (hash(l1) >>> 30 ^ l1) * -4658895280553007687L;
        l1 ^= hash(l2) >>> 31;
        return l1;
    }
    
    public static long hash(long l1, final long l2, final long l3) {
        l1 = (hash(l1) >>> 30 ^ l1) * -4658895280553007687L;
        l1 = (hash(l2) >>> 27 ^ l1) * -7723592293110705685L;
        l1 ^= hash(l3) >>> 31;
        return l1;
    }
    
    public static long hash(long l1, final long l2, final long l3, final long l4) {
        l1 = (hash(l1) >>> 30 ^ l1) * -4658895280553007687L;
        l1 = (hash(l2) >>> 27 ^ l1) * -7723592293110705685L;
        l1 = (hash(l3) >>> 30 ^ l1) * -6389720478792763523L;
        l1 ^= hash(l4) >>> 31;
        return l1;
    }
    
    public static long rehash(final long l1) {
        return hash(hash(l1));
    }
    
    public static long rehash(final long l1, final long l2) {
        return hash(hash(l1, l2));
    }
    
    public static long rehash(final long l1, final long l2, final long l3) {
        return hash(hash(l1, l2, l3));
    }
    
    public static long rehash(final long l1, final long l2, final long l3, final long l4) {
        return hash(hash(l1, l2, l3, l4));
    }
    
    public static double random(final long l1) {
        return hashToRandomDouble(rehash(l1));
    }
    
    public static double random(final long l1, final long l2) {
        return hashToRandomDouble(rehash(l1, l2));
    }
    
    public static double random(final long l1, final long l2, final long l3) {
        return hashToRandomDouble(rehash(l1, l2, l3));
    }
    
    public static double random(final long l1, final long l2, final long l3, final long l4) {
        return hashToRandomDouble(rehash(l1, l2, l3, l4));
    }
    
    public static int randomInt(final long l1, final long l2, final long l3, final int bound) {
        long hash = rehash(l1, l2, l3);
        hash &= Long.MAX_VALUE;
        return (int)(hash % bound);
    }
    
    private static double hashToRandomDouble(long hash) {
        hash &= 0xFFFFFFFFL;
        return hash / 4.294967295E9;
    }
    
    public static long hashUuid(@Nonnull final UUID uuid) {
        return hash(uuid.getLeastSignificantBits(), uuid.getMostSignificantBits());
    }
    
    private HashUtil() {
    }
}
