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

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

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


繁星点点滴滴
浏览 147回答 2
2回答

DIEA

我认为您的第一个要求(不将每个促销代码保存在数据库中)是有问题的。那么问题来了,同一个优惠码可以多次兑换吗?如果这是不允许的,那么您无论如何都必须将已经兑换的代码存储在某个持久数据存储中,那么为什么不从一开始就将生成的代码以及指示它是否已兑换的标志存储在持久数据存储中呢?如果您不想存储所有代码/无法存储所有代码,您仍然可以使用Random带有当前广告系列独有的种子的 a :long seed = 20190921065347L; // identifies your current campaignRandom r = new Random(seed);for (int i = 0; i < numCodes; i++) {&nbsp; &nbsp; System.out.println(r.nextLong());}或者long seed = 20190921065347L; // identifies your current campaignRandom r = new Random(seed);r.longs(numCodes, 100_000_000_000_000L, 1_000_000_000_000_000L)&nbsp;.forEach(System.out::println);要确定代码是否有效,您可以再次生成相同的代码:long seed = 20190921065347L; // identifies your current campaignRandom r = new Random(seed);System.out.println(&nbsp; &nbsp; r.longs(numCodes, 100_000_000_000_000L, 1_000_000_000_000_000L)&nbsp; &nbsp; &nbsp;.anyMatch(l -> l == 350160558695557L));

一只萌萌小番薯

像这样的东西会起作用吗?&nbsp; &nbsp; &nbsp; Random r = new Random();&nbsp; &nbsp; &nbsp; long start = 1_000_000_000;&nbsp; &nbsp; &nbsp; long end = 10_000_000_000L;&nbsp; &nbsp; &nbsp; long n = r.longs(1, start, end).reduce(0, (a, b) -> b);&nbsp; &nbsp; &nbsp; String s = String.format("%,d", n).replace(",", "-");&nbsp; &nbsp; &nbsp; System.out.println(s);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java