Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 许可证密钥生成器冲突概率_Java_Statistics - Fatal编程技术网

Java 许可证密钥生成器冲突概率

Java 许可证密钥生成器冲突概率,java,statistics,Java,Statistics,我已经编写了生成许可证密钥的代码 *它必须是A-Z或0-9(36种可能性) *前4位始终为MKDC,后16位随机生成 我想了解如何计算碰撞概率(生成的两个许可证相同) 公共类随机{ 公共静态void main(字符串[]args){ 字符串licensestring=“MKDC-”; 字符许可证[]={ ‘A’、‘B’、‘C’、‘D’、‘E’、‘F’、‘G’、‘H’、‘I’、‘J’、‘K’、‘L’、‘M’、‘N’、‘O’、‘P’、‘Q’、‘R’、‘S’、‘T’、‘U’、‘V’、‘W’、‘X’、‘

我已经编写了生成许可证密钥的代码

*它必须是A-Z或0-9(36种可能性)

*前4位始终为MKDC,后16位随机生成

我想了解如何计算碰撞概率(生成的两个许可证相同)

公共类随机{
公共静态void main(字符串[]args){
字符串licensestring=“MKDC-”;
字符许可证[]={
‘A’、‘B’、‘C’、‘D’、‘E’、‘F’、‘G’、‘H’、‘I’、‘J’、‘K’、‘L’、‘M’、‘N’、‘O’、‘P’、‘Q’、‘R’、‘S’、‘T’、‘U’、‘V’、‘W’、‘X’、‘Y’、‘Z’、‘0’、‘1’、‘2’、‘3’、‘4’、‘5’、‘6’、‘7’、‘8’、‘9’
};
int x=0;
而(x<16){
java.security.SecureRandom rand=new java.security.SecureRandom();
int random number=rand.nextInt(36);
licensestring=licensestring+许可证[randomNumber];
x=x+1;
如果(x==4 | | x==8 | | x==12){
licensestring=licensestring+“-”;
}
}
System.out.println(licensestring);
}
}

我说答案是(1/36)^16是否过于简单化了?

我说答案是(1/36)^16是否过于简单化了?

对于两个生成的许可证,一个许可证的变量字符必须与另一个许可证的变量字符匹配。这等于

该值约为0.00000000000000000125

但是,对于多个许可证,概率会增加。对于n个许可证,概率为:


密钥空间非常巨大,Wolfram | alpha是使用当前方法获得合理数量密钥的碰撞概率。

对于生成的两个许可证,其中一个许可证的可变字符必须与另一个许可证的可变字符相匹配。这等于

该值约为0.00000000000000000125

但是,对于多个许可证,概率会增加。对于n个许可证,概率为:


密钥空间非常巨大,以至于Wolfram | alpha是使用当前方法获得合理数量密钥的碰撞概率。

你比我快了3秒,得到了上标格式。给这个答案。我应该担心冲突的频率级别,还是因为数据库中已经存在该许可证,有1.25%的时间我必须再次运行代码?Dave你是怎么得到1.25%的?两个许可证发生冲突的概率为
0.00000000000000000125649275196583246654584500576187130695567024443641674
。这是如此之小,简单地检查一个副本,并处理它,而不担心性能,将是最佳的。我一定是误解了windows计算器的结果,它说1.256492751965832466547845005762E-25。哦,我明白了,25是0的前导数字。@Dave Yep,e是科学符号。一个快速的方法就是知道1.25%大于1/100,而我给出的分数要小得多。你比我快了3秒,得到了上标格式。给这个答案。我应该担心冲突的频率级别,还是因为数据库中已经存在该许可证,有1.25%的时间我必须再次运行代码?Dave你是怎么得到1.25%的?两个许可证发生冲突的概率为
0.00000000000000000125649275196583246654584500576187130695567024443641674
。这是如此之小,简单地检查一个副本,并处理它,而不担心性能,将是最佳的。我一定是误解了windows计算器的结果,它说1.256492751965832466547845005762E-25。哦,我明白了,25是0的前导数字。@Dave Yep,e是科学符号。一个快速了解眼球的方法就是知道1.25%大于1/100,而我给出的分数要小得多。
public class Random {

public static void main(String[] args) {
    String licensestring = "MKDC-";
    char license[]  = {
        'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9'
    };

    int x = 0;
    while (x < 16){
        java.security.SecureRandom rand = new java.security.SecureRandom();
        int randomNumber = rand.nextInt(36);
        licensestring = licensestring + license[randomNumber];
        x = x + 1;
        if (x == 4 || x == 8 || x == 12){
            licensestring = licensestring + "-";
        }
    }
    System.out.println(licensestring);
}

}