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

License Key Generator Probability of Collision

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

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

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

我想了解如何计算冲突概率(2 个生成的许可证相同)。

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

}

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

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

的概率

这个值大约是 0.00000000000000000000000125。

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

密钥 space 非常大,Wolfram|alpha 是 unable to determine 使用当前方法对合理数量的密钥的碰撞概率。