【发布时间】:2021-01-12 09:54:21
【问题描述】:
我为一个银行项目工作,他们的要求是为每笔交易生成唯一的交易参考。 UTR 的格式为:
这个 5 位序列 ID 也可以是字母数字。每天的交易量最高可达 100-200K。
如果我使用 Oracle 序列,那么我只能有 10K 个值。
我尝试使用SecureRandom 生成器并生成了 200K 5 长度的字符串,但它生成了大约 30 个重复的字符串。
下面是我使用的代码sn-p
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++;
}
【问题讨论】:
-
“这个 5 位 seqid 可以是字母数字” --- 这是什么意思?每个位置可以是
0-9还是A-Z?a-z是否也被允许并被认为与A-Z不同?允许使用其他字符吗? --- 如果只允许0-9和A-Z,那将是 36 个不同的字符,这意味着一个 Base-36 数字。在 Base-36 中有 5 个“数字”,您可以有 36^5 = 60466176 个不同的值。 --- 仅供参考: JavaInteger类可以格式化 Base-36 数字。 -
以 36 为基数计数,而不是使用随机数。
-
嗯......结果是预期的。这是birthday problem 的变体。总共,您有
36^5可能的密码。提取 100k 个不重复密码的概率是((36!) / (36! - 100000)!) / ((36^5)^100000) ~ 1.70 * 10^-36,又名。不太可能。 -
如果你想要一个序列,为什么要使用随机?
-
是的,但序列不是确保每个值唯一的最简单方法吗?当然,除非你有其他要求。
标签: java uniqueidentifier