57 lines
2.1 KiB
Java
57 lines
2.1 KiB
Java
package net.minecraft.world.level.levelgen;
|
|
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
import com.google.common.base.Charsets;
|
|
import com.google.common.hash.HashFunction;
|
|
import com.google.common.hash.Hashing;
|
|
import com.google.common.primitives.Longs;
|
|
import java.util.concurrent.atomic.AtomicLong;
|
|
|
|
public final class RandomSupport {
|
|
public static final long GOLDEN_RATIO_64 = -7046029254386353131L;
|
|
public static final long SILVER_RATIO_64 = 7640891576956012809L;
|
|
private static final HashFunction MD5_128 = Hashing.md5();
|
|
private static final AtomicLong SEED_UNIQUIFIER = new AtomicLong(8682522807148012L);
|
|
|
|
@VisibleForTesting
|
|
public static long mixStafford13(long seed) {
|
|
seed = (seed ^ seed >>> 30) * -4658895280553007687L;
|
|
seed = (seed ^ seed >>> 27) * -7723592293110705685L;
|
|
return seed ^ seed >>> 31;
|
|
}
|
|
|
|
public static RandomSupport.Seed128bit upgradeSeedTo128bitUnmixed(long seed) {
|
|
long l = seed ^ 7640891576956012809L;
|
|
long m = l + -7046029254386353131L;
|
|
return new RandomSupport.Seed128bit(l, m);
|
|
}
|
|
|
|
public static RandomSupport.Seed128bit upgradeSeedTo128bit(long seed) {
|
|
return upgradeSeedTo128bitUnmixed(seed).mixed();
|
|
}
|
|
|
|
public static RandomSupport.Seed128bit seedFromHashOf(String string) {
|
|
byte[] bs = MD5_128.hashString(string, Charsets.UTF_8).asBytes();
|
|
long l = Longs.fromBytes(bs[0], bs[1], bs[2], bs[3], bs[4], bs[5], bs[6], bs[7]);
|
|
long m = Longs.fromBytes(bs[8], bs[9], bs[10], bs[11], bs[12], bs[13], bs[14], bs[15]);
|
|
return new RandomSupport.Seed128bit(l, m);
|
|
}
|
|
|
|
public static long generateUniqueSeed() {
|
|
return SEED_UNIQUIFIER.updateAndGet(l -> l * 1181783497276652981L) ^ System.nanoTime();
|
|
}
|
|
|
|
public record Seed128bit(long seedLo, long seedHi) {
|
|
public RandomSupport.Seed128bit xor(long seedLo, long seedHi) {
|
|
return new RandomSupport.Seed128bit(this.seedLo ^ seedLo, this.seedHi ^ seedHi);
|
|
}
|
|
|
|
public RandomSupport.Seed128bit xor(RandomSupport.Seed128bit seed) {
|
|
return this.xor(seed.seedLo, seed.seedHi);
|
|
}
|
|
|
|
public RandomSupport.Seed128bit mixed() {
|
|
return new RandomSupport.Seed128bit(RandomSupport.mixStafford13(this.seedLo), RandomSupport.mixStafford13(this.seedHi));
|
|
}
|
|
}
|
|
}
|