gpt4 book ai didi

java - 基于哈希创建一个统一的随机数

转载 作者:行者123 更新时间:2023-11-30 05:53:06 26 4
gpt4 key购买 nike

我需要一个基于由字符串和长整数组成的 key 的良好伪随机数。当我使用相同的 key 进行查询时,我应该得到相同的随机数,而且,如果我使用稍微不同的 key 进行查询,我应该得到一个非常不同的数字,即使说 key 中的 long 被 1 关闭。我试过这段代码并且随机数是唯一的,但对于相似的数字,它们似乎是相关的。

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);
}
}
}

我拼凑的解决方案。这工作得很好,但我想知道是否需要这么冗长。

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);
}
}
}

最佳答案

你说“当我使用相同的 key 查询时,我应该得到相同的随机数,而且,如果我使用稍微不同的 key 进行查询,我应该得到一个非常不同的数字”。如果我对您的问题的理解正确,那么您不需要随机数,而是想要加密哈希码之类的东西。

您应该考虑通过 SHA 或 MD5 等哈希函数传递您拥有的任何数据。这会给你一些关于输入看似随机的东西,但在给定相同输入的情况下总是相同的,并且即使你的输入变化很小,也会有很大变化。

编辑:要始终如一地获得 double 值,请尝试这样的事情(伪代码):

SHAHashValue v = ComputeSHA( yourObject);
Random r = new Random(v);
the_random_value = r.getNext();

这里的想法是使用 SHA 哈希值作为种子来初始化您的随机生成器。这几乎就是你所拥有的,但我不知道你的 HashBuilder 会根据不同的值产生什么。因此,改用 SHA 哈希可能会改善这种情况。

您还应该考虑到 0 和 1 之间的 double 值“非常不同”的值可能不会立即显现出来。

关于java - 基于哈希创建一个统一的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10969733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com