Erstellen Sie eine einheitliche Zufallszahl basiert auf einer hash

Ich brauche einen guten pseudo-random-Zahl, basierend auf einem Schlüssel, der aus einem string und einem langen. Ich sollte die gleiche Zufallszahl, wenn ich die Abfrage mit dem gleichen Schlüssel und auch, ich sollte bekommen eine ganz andere Nummer, wenn ich die Abfrage mit einem etwas anderen Schlüssel, auch wenn Sie sagen, die lange in der Taste aus ist, indem 1. Ich habe versucht, diesen code und die Zufallszahlen eindeutig sind, aber für ähnliche zahlen Sie scheinen korreliert.

import java.util.Date;
import java.util.Random;
import org.apache.commons.lang3.builder.HashCodeBuilder;

public class HashKeyTest {
    long time;
    String str;
    public HashKeyTest(String str, long time) {
        this.time = time;
        this.str = str;
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(time).append(str).toHashCode();
    }

    public static void main(String[] args) throws Exception {
        for(int i=0; i<10; i++){
            long time = new Date().getTime();
            HashKeyTest hk = new HashKeyTest("SPY", time);
            long hashCode = (long)hk.hashCode();
            Random rGen = new Random(hashCode);
            System.out.format("%d:%d:%10.12f\n", time, hashCode, rGen.nextDouble());
            Thread.sleep(1);
        }
    }
}

Lösung, die ich mir zusammengebastelt. Das funktioniert ziemlich gut, aber ich Frage mich, ob es braucht, um diese ausführlich.

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

public class HashKeyTest implements Serializable{

    long time;
    String str;

    public HashKeyTest(String str, long time) {
        this.time = time;
        this.str = str;
    }

    public double random() throws IOException, NoSuchAlgorithmException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(bos);
        out.writeObject(this);
        byte[] bytes = bos.toByteArray();
        MessageDigest md5Digest = MessageDigest.getInstance("MD5");
        byte[] hash = md5Digest.digest(bytes);
        ByteBuffer bb = ByteBuffer.wrap(hash);
        long seed = bb.getLong();

        return new Random(seed).nextDouble();
    }

    public static void main(String[] args) throws Exception {
        long time = 0;
        for (int i = 0; i < 10; i++) {
            time += 250L;
            HashKeyTest hk = new HashKeyTest("SPY", time);
            System.out.format("%d:%10.12f\n", time, hk.random());
            Thread.sleep(1);
        }
    }
}
  • Die Lösung ist ungeeignet für die meisten Zwecke, einschließlich gaming. Es ist im wesentlichen re-instanziieren eines RNG für jeden Anruf.
InformationsquelleAutor fodon | 2012-06-10
Schreibe einen Kommentar