java - 如何生成固定长度的随机数而不发生冲突?

标签 java random

我正在开发一个应用程序,我必须在其中生成 Google 类 等代码。当用户创建一个类时,我使用以下函数生成代码

 private String codeGenerator(){
        StringBuilder stringBuilder=new StringBuilder();
        String chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        int characterLength=chars.length();
        for(int i=0;i<5;i++){
            stringBuilder.append(chars.charAt((int)Math.floor(Math.random()*characterLength)));
        }
        return stringBuilder.toString();
    }

因为我有 62 个不同的角色。我可以生成总计 5^62 代码总数,这是相当大的。我可以在服务器或用户设备中生成此代码。所以我的问题是哪一种方法更好?生成的代码与其他代码发生冲突的可能性有多大?

最佳答案

从评论来看,您似乎正在为自己的应用程序生成组代码。

对于您的应用的用途和规模,5 个字符的代码可能比较合适。但有几点你应该知道:

  • 随机数生成器并非旨在生成唯一的数字。您可以像现在一样生成随机代码,但在将该代码视为唯一之前,您应该检查该代码的唯一性(例如,对照存储已生成的组代码的表检查它)。
  • 如果用户需要输入群组代码,您应该提供一种方法来检查群组代码是否有效,以避免用户意外加入与预期不同的群组。这通常是通过在组代码末尾添加所谓的“校验和数字”来完成的。另请参阅this answer .
  • 您似乎正在尝试生成难以猜测的代码。在这种情况下,Math.random()远远不合适(如 java.util.Random )——特别是因为组代码非常短。请改用安全的随机生成器,例如 java.security.SecureRandom (幸运的是,它的安全问题已在 Android 4.4 中得到解决,正如我从您的评论中可以看出的那样,这是您的应用程序支持的最低 Android 版本;另请参阅 this question )。另外,如果可能的话,使组代码更长,例如 8 或 12 个字符长。

有关详细信息,请参阅 Unique Random Identifiers .

<小时/>

此外,还有另一个问题。如果 5 个字符的组代码是唯一授予该组访问权限的内容,则会出现严重的安全问题。理想情况下,应该有其他形式的授权,例如仅允许登录用户或某些登录用户 -

  • 通过该群组代码访问该群组,或者
  • 通过该群组代码接受加入群组的邀请(例如,在 Google 类中,当用户尝试接受加入类(class)的邀请时,可能会出现 PERMISSION_DENIED 错误代码)。

关于java - 如何生成固定长度的随机数而不发生冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57900961/

相关文章:

php - 兰德();排除并已经随机生成的数字..?

javascript - 如何使用 HTML5 刮刮卡渲染随机背景

java - 为什么从我的文件中读取的最小数字总是 0? ( java )

java - 未生成 EMMA coverage.ec

java - 在 Mac 中将 Play 脚本添加到您的 PATH

java - 如何从 try/catch block 中获取变量?

random - 如何从 SPARQL 中选择随机 DBPedia 节点?

c# - 使用两个种子获取静态随机值

java - 为什么线程释放锁后仍然运行?

java - 对象未填充