我一直在寻找一种简单的 Java 算法来生成伪随机字母数字字符串。在我的情况下,它将用作唯一的会话/密钥标识符,该标识符“可能”在一代中是唯一的(我的需求实际上并不需要更复杂的东西)。500K+
理想情况下,我将能够根据我的独特性需求指定长度。例如,生成的长度为 12 的字符串可能类似于 。"AEYGF7K0DM1X"
网友回答:
Java提供了一种直接执行此操作的方法。如果您不想要破折号,它们很容易去除。只需使用uuid.replace("-", "")
import java.util.UUID;
public class randomStringGenerator {
public static void main(String[] args) {
System.out.println(generateString());
}
public static String generateString() {
String uuid = UUID.randomUUID().toString();
return "uuid = " + uuid;
}
}
uuid = 2d7428a6-b58c-4008-8575-f05549f16316
网友回答:
要生成随机字符串,请连接从可接受的符号集中随机绘制的字符,直到字符串达到所需的长度。
这里有一些相当简单且非常灵活的代码,用于生成随机标识符。阅读以下信息,了解重要的应用说明。
public class RandomString {
/**
* Generate a random string.
*/
public String nextString() {
for (int idx = 0; idx < buf.length; ++idx)
buf[idx] = symbols[random.nextInt(symbols.length)];
return new String(buf);
}
public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String lower = upper.toLowerCase(Locale.ROOT);
public static final String digits = "0123456789";
public static final String alphanum = upper + lower + digits;
private final Random random;
private final char[] symbols;
private final char[] buf;
public RandomString(int length, Random random, String symbols) {
if (length < 1) throw new IllegalArgumentException();
if (symbols.length() < 2) throw new IllegalArgumentException();
this.random = Objects.requireNonNull(random);
this.symbols = symbols.toCharArray();
this.buf = new char[length];
}
/**
* Create an alphanumeric string generator.
*/
public RandomString(int length, Random random) {
this(length, random, alphanum);
}
/**
* Create an alphanumeric strings from a secure generator.
*/
public RandomString(int length) {
this(length, new SecureRandom());
}
/**
* Create session identifiers.
*/
public RandomString() {
this(21);
}
}
为 8 个字符的标识符创建不安全的生成器:
RandomString gen = new RandomString(8, ThreadLocalRandom.current());
为会话标识符创建安全生成器:
RandomString session = new RandomString();
使用易于阅读的代码创建用于打印的生成器。字符串比完整的字母数字字符串长,以补偿使用较少的符号:
String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx";
RandomString tickets = new RandomString(23, new SecureRandom(), easy);
生成可能唯一的会话标识符还不够好,或者您可以只使用简单的计数器。攻击者在使用可预测标识符时劫持会话。
长度和安全性之间存在紧张关系。较短的标识符更容易猜测,因为可能性较小。但较长的标识符会消耗更多的存储空间和带宽。较大的符号集会有所帮助,但如果标识符包含在 URL 中或手动重新输入,则可能会导致编码问题。
会话标识符的随机性或熵的潜在来源应来自为加密设计的随机数生成器。但是,初始化这些生成器有时计算成本高昂或速度很慢,因此应尽可能重用它们。
并非每个应用程序都需要安全性。随机分配可能是多个实体在共享空间中生成标识符的有效方法,无需任何协调或分区。协调可能很慢,尤其是在群集或分布式环境中,当实体最终获得的共享太小或太大时,拆分空间会导致问题。
如果攻击者可能能够查看和操纵它们,则应通过其他方式保护未采取措施使其不可预测的标识符,就像在大多数 Web 应用程序中发生的那样。应该有一个单独的授权系统来保护其标识符可以在没有访问权限的情况下被攻击者猜到的对象。
还必须注意使用足够长的标识符,以便在预期的标识符总数下不太可能发生冲突。这被称为“生日悖论”。碰撞的概率p大约是n2/(2q x),其中n是实际生成的标识符的数量,q是字母表中不同符号的数量,x是标识符的长度。这应该是一个非常小的数字,例如 2-50 或更少。
研究表明,500k 15个字符的标识符之间发生碰撞的几率约为2-52,这可能比宇宙射线等未检测到的错误的可能性要小。
根据其规范,UUID 并非设计为不可预测,也不应用作会话标识符。
标准格式的 UUID 占用大量空间:36 个字符仅包含 122 位熵。(并非“随机”UUID 的所有位都是随机选择的。随机选择的字母数字字符串仅包含 21 个字符的更多熵。
UUID 不灵活;它们具有标准化的结构和布局。这是他们的主要优点,也是他们的主要弱点。与外部方协作时,UUID 提供的标准化可能会有所帮助。对于纯粹的内部使用,它们可能效率低下。
网友回答:
static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
static SecureRandom rnd = new SecureRandom();
String randomString(int len){
StringBuilder sb = new StringBuilder(len);
for(int i = 0; i < len; i++)
sb.append(AB.charAt(rnd.nextInt(AB.length())));
return sb.toString();
}
模板简介:该模板名称为【一种简单的 Java 算法来生成伪随机字母数字字符串】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。