Создать диапазон промо-кодов, которые не могут быть угаданы - PullRequest
1 голос
/ 20 сентября 2019

Я ищу способ создания промо-кодов.Было бы тривиально, если бы не эти требования.То, что это должен быть диапазон (не сохраняя каждый промо-код в базе данных), чтобы сделать его быстрым, и что он не может быть угадан, поэтому он не может генерировать такие коды, как 000-000-001, 000-000-002, 000-000-003 ... и т. Д.

Существует ли алгоритм для решения этой проблемы?Я мог бы попытаться решить эту проблему с помощью некоторого хеширования, но попытка решить эту проблему безопасности самостоятельно могла бы оставить службу открытой для эксплойтов, о которых я не думал.

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Я думаю, ваше первое требование (не сохранение каждого промокода в базе данных) проблематично.

Вопрос в том, разрешено ли использовать один промокод несколько раз?

Еслиэто не разрешено, тогда вам все равно нужно хранить уже выкупленные коды в каком-то постоянном хранилище данных, так почему бы не сохранить сгенерированные коды в хранилище постоянных данных с самого начала вместе с флагом, указывающим, был ли он погашен или нет?


Если вы не хотите хранить все коды / не можете сохранить все коды, вы все равно можете использовать Random с начальным числом, уникальным для вашей текущей кампании:

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));
0 голосов
/ 20 сентября 2019

Хотелось бы что-нибудь подобное?

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