首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成不可猜测的晋升代码范围

生成不可猜测的晋升代码范围
EN

Stack Overflow用户
提问于 2019-09-20 18:11:40
回答 2查看 134关注 0票数 1

我在寻找一种产生一系列促销代码的方法。如果没有这两种需求,这将是微不足道的。它需要是一个范围(而不是保存数据库中的每一个促销代码)来使它快速,并且它是不可猜测的,所以它不能生成像这个000,000-001,000-002,000,000-003这样的代码.诸若此类。

有解决这个问题的算法吗?我可以尝试用某种哈希方法来解决它,但试图自己解决这个安全问题可能会让服务受到我没有想到的攻击。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-21 09:30:38

我认为您的第一个要求(没有保存数据库中的所有促销代码)是有问题的。

问题是,是否允许多次赎回单一的促销代码?

如果这是不允许的,那么无论如何,您必须将已经赎回的代码存储在某些持久性数据存储中,那么为什么不从一开始就将生成的代码存储在持久数据存储中,同时使用一个指示是否已被赎回的标志?

如果您不想存储所有代码/无法存储所有代码,则仍然可以使用带有当前活动特有种子的Random

代码语言:javascript
复制
long seed = 20190921065347L; // identifies your current campaign
Random r = new Random(seed);
for (int i = 0; i < numCodes; i++) {
    System.out.println(r.nextLong());
}

代码语言:javascript
复制
long seed = 20190921065347L; // identifies your current campaign
Random r = new Random(seed);
r.longs(numCodes, 100_000_000_000_000L, 1_000_000_000_000_000L)
 .forEach(System.out::println);

要确定代码是否有效,可以再次生成相同的代码:

代码语言:javascript
复制
long seed = 20190921065347L; // identifies your current campaign
Random r = new Random(seed);
System.out.println(
    r.longs(numCodes, 100_000_000_000_000L, 1_000_000_000_000_000L)
     .anyMatch(l -> l == 350160558695557L));
票数 1
EN

Stack Overflow用户

发布于 2019-09-20 19:08:55

像这样的东西有用吗?

代码语言:javascript
复制
      Random r = new Random();
      long start = 1_000_000_000;
      long end = 10_000_000_000L;

      long n = r.longs(1, start, end).reduce(0, (a, b) -> b);
      String s = String.format("%,d", n).replace(",", "-");
      System.out.println(s);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58033330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档