我参与一个银行项目,他们的要求是为每个交易生成唯一的交易参考号。UTR的格式如下:
<银行代码><YYDDD><5位数字SequenceId>。
这个5位数字的SequenceId也可以是字母数字混合的。每天的交易量可能会达到10-20万笔。
如果我使用Oracle序列,那么我只能有10K个值。
我尝试使用SecureRandom
生成器并生成了200K个5位长度的字符串,但它生成了大约30个重复字符串。
下面是我使用的代码片段:
int leftLimit = 48;
int rightLimit = 122;
int i1=0;
Random random = new SecureRandom();
while (i1<200000) {
String generatedString = random.ints(leftLimit, rightLimit+1)
.filter(i -> (i<=57||i>=65) && ( i<=90|| i>=97))
.limit(5)
.collect(StringBuilder::new,
StringBuilder::appendCodePoint,
StringBuilder::append)
.toString();
System.out.println(generatedString);
i1++;
}
36^5
个可能的密码。在没有重复的情况下提取100k个密码的概率为((36!) / (36! - 100000)!) / ((36^5)^100000) ~ 1.70 * 10^-36
,也就是非常不可能。 - Turing85