我正在开发一个应用程序,我必须在其中生成 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/