为了账号安全,请及时绑定邮箱和手机立即绑定

生成一系列不可猜测的促销代码

生成一系列不可猜测的促销代码

繁星点点滴滴 2023-08-16 16:38:54
我正在寻找一种生成一系列促销代码的方法。如果不满足这两个要求,那将是微不足道的。它需要是一个范围(不是将每个促销代码保存在数据库中)以使其快速,并且它是不可猜测的,因此它不能生成像这样的代码 000-000-001, 000-000-002, 000- 000-003...等等。有没有算法可以解决这个问题?我可以尝试使用某种哈希来解决它,但尝试自己解决这个安全问题可能会让服务受到我没有想到的攻击。
查看完整描述

2 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

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


那么问题来了,同一个优惠码可以多次兑换吗?


如果这是不允许的,那么您无论如何都必须将已经兑换的代码存储在某个持久数据存储中,那么为什么不从一开始就将生成的代码以及指示它是否已兑换的标志存储在持久数据存储中呢?


如果您不想存储所有代码/无法存储所有代码,您仍然可以使用Random带有当前广告系列独有的种子的 a :


long seed = 20190921065347L; // identifies your current campaign

Random r = new Random(seed);

for (int i = 0; i < numCodes; i++) {

    System.out.println(r.nextLong());

}

或者


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);

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


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));


查看完整回答
反对 回复 2023-08-16
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

像这样的东西会起作用吗?


      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);


查看完整回答
反对 回复 2023-08-16
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信