Java 产生重复的随机码种子

Java 产生重复的随机码种子,java,Java,我有下面的测试程序,我正试图用它来种子一个随机数使用电话号码加上当前时间。下面的代码似乎产生了重复的代码。有什么想法吗 计数=100000 尺寸=683 它是复制的,因为你使用的是System.currentTimeMillis,这意味着在一毫秒内,这个值不变,你的种子也不变。在一毫秒的时间内,你会多次通过你的循环 我认为没有办法以纳秒为单位计算时间。如果应用程序可能的话,您应该至少等待一毫秒您生成的不同种子数与生成所有种子所用的毫秒数直接相关。使用System.currentTimeMilli

我有下面的测试程序,我正试图用它来种子一个随机数使用电话号码加上当前时间。下面的代码似乎产生了重复的代码。有什么想法吗

计数=100000 尺寸=683


它是复制的,因为你使用的是System.currentTimeMillis,这意味着在一毫秒内,这个值不变,你的种子也不变。在一毫秒的时间内,你会多次通过你的循环


我认为没有办法以纳秒为单位计算时间。如果应用程序可能的话,您应该至少等待一毫秒

您生成的不同种子数与生成所有种子所用的毫秒数直接相关。使用System.currentTimeMillis测量循环所用的时间,然后打印它,我的时间总是等于大小1

解决方案:改用System.nanoTime

进行此更改时,大小始终为1000。这是因为%1000L,它将任何给定电话号码的可能输出数最大化为1000。如果可以,请将其删除

编辑:来自:

公共种子

使用给定长种子中包含的八个字节重新设定此随机对象的种子。给定的种子是对现有种子的补充,而不是替代。因此,重复调用保证不会减少随机性

虽然OP所做的可能不是必需的,但它不应该是安全风险,因为setSeed不会将SecureRandom对象重置为可预测的状态


此外,反复产生相同的种子并不是一个真正的问题,因为同样的事实:最终,安全性依赖于SecureRandom的内部工作,而不是种子生成…

不要这样重置种子。您使用的是SecureRandom,根本不要设置种子。你为什么要播种?使用电话号码加上当前时间意味着什么?@ElliottFrisch我想根据用户的电话号码和时间戳生成一个随机数,以确保这是一个随机数,但对他们来说是唯一的。这意味着不能保证。无论是使用序列号生成器1、2、3还是计划重复项,都不要为SecureRandom设定种子-这是自设定种子。不要在每次随机调用时更新种子;实际上,你保证不会得到随机结果。如果你不想得到重复的结果,为什么还要使用种子呢?对每个数字使用不同的随机生成器是没有意义的。不要那样做。
import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class Test {
    static int LENGTH = 8;
    static String VAULES = "0123456789";
    static int cnt = 0;

    public static void main(String[] args) {
        Set<Long> codes = new HashSet<Long>();
        for(int i = 0; i < 100000; i++){
            Long seed = Long.valueOf(PHONE_VAULES) * 1000 + System.currentTimeMillis() % 1000L;

            codes.add(seed);
            System.out.println(generateRandomPassword(seed));
            cnt = cnt + 1;
        }
        System.out.println("count="+ cnt);
        System.out.println("size="+ codes.size());
    }

    public static String generateRandomPassword(long seed) {
        Random random = new SecureRandom();
        random.setSeed(seed);
        return Long.toString(random.nextLong()).substring(1, CODE_LENGTH + 1);
    }

}