在java中生成6位pin
Posted
技术标签:
【中文标题】在java中生成6位pin【英文标题】:Generate 6 digit pin in java 【发布时间】:2019-10-25 17:27:11 【问题描述】:我有一个要求,用户必须看到为订单生成的 pin,并且必须共享/用作该特定订单的授权码。
所以我正在寻找一个库,它可以生成 6 位长度的随机唯一针脚,可用于每次交易。
请分享您对此的看法。
谢谢..
【问题讨论】:
你有没有研究过“如何在Java中生成特定范围内的随机整数?” 只有6位,生成的pin只能在短时间内唯一。 您可以在这里找到答案:link,您的范围将在 100000 到 999999 之间int n = 100000 + random_float() * 900000;
已经有一个类似的答案是here
为什么这个问题被否决了?
【参考方案1】:
您可以使用内置的 **java.util.Random 类 ** 在 java 中手动生成 pin。您可以在身份验证中使用它来生成六位随机数字密码。
int rand_int1 = rand.nextInt(1000000);
if rand_int1 has 6 digits
print(rand_int1)
else
generate(again)
这将生成一个六位数的随机数。
【讨论】:
它可能会生成少于 6 位的数字。 可以生成数字 @fahime 你的意思是像000111
?
@talex 不,我的意思是像 78168 这样的数字,它是这段代码的真正输出。
@fahime 取决于您的打印方式。您可以将其打印为078168
。或者您的意思是不允许使用前导零?【参考方案2】:
我正在寻找一个可以生成随机独特引脚的库
如果您生成一个随机整数,则不能保证它始终是唯一的。使用 6 位数字,用户有百万分之一的机会获得相同的订单号。您可以增加位数,也可以允许字母字符减少获得相同订单号的机会。
但是,真正确保每个订单号都是唯一的唯一方法是保持订单总数的连续统计。那么每个用户的订单号实际上就是你收到的第 n 个订单。
【讨论】:
对于 OP 要求的应用,PIN 只需要在很短的时间内是唯一的,1-2 分钟。【参考方案3】:你可以试试SecureRandom
从here提取
java.security.SecureRandom 类:该类提供了一个强加密随机数生成器 (RNG)。加密强随机数至少符合 FIPS 140-2,加密模块的安全要求,第 4.9.1 节中指定的统计随机数生成器测试。此外,SecureRandom 必须产生非确定性的输出。因此,任何传递给 SecureRandom 对象的种子材料都必须是不可预测的,并且所有 SecureRandom 输出序列都必须具有强大的加密能力。
java.util.Random 类:Random 中定义的类在密码学上不强,并且选择的数字不是完全随机的,因为有明确的数学算法(基于 Donald E. Knuth 的减法随机数生成器算法)用于选择它们。因此,将此类用于需要高度安全性的任务是不安全的,例如创建随机密码等。
使用 SecureRandom 的示例:
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
int myInt = sr.nextInt(9000000) + 1000000;
【讨论】:
【参考方案4】:请使用 Apache 库。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
int random = RandomUtils.nextInt(1, 7);
参考:https://www.java67.com/2018/01/3-ways-to-generate-random-integers-on.html
【讨论】:
RandomStringUtils.randomNumeric(6)
生成 6 位随机码。以上是关于在java中生成6位pin的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android KeyStore 中生成 KeyPair,受自定义密码保护