Я хотел бы генерировать коды купонов, например. AYB4ZZ2
. Тем не менее, я также хотел бы отметить отметки используемых купонов и ограничить их глобальное число, скажем N
. Наивный подход был бы чем-то вроде "генерировать N
уникальные буквенно-цифровые коды, помещать их в базу данных и выполнять поиск db при каждой операции купона".
Однако, насколько я понимаю, мы можем также попытаться найти функцию MakeCoupon(n)
, которая преобразует данное число в купонную строку с предопределенной длиной.
Насколько я понимаю, MakeCoupon
должен заполнить следующие требования:
-
Быть биективным. Он обратный
MakeNumber(coupon)
должен быть эффективно вычислимым. -
Вывод для
MakeCoupon(n)
должен быть буквенно-цифровым и иметь небольшую длину и константу, чтобы его можно было называть удобочитаемым человеком. Например.SHA1
digest не будет передавать это требование. -
Практическая уникальность. Результаты
MakeCoupon(n)
для каждого естественногоn <= N
должны быть полностью уникальными или уникальными в тех же терминах, что, например,MD5
является уникальным (с той же чрезвычайно малой вероятностью столкновения). -
(это сложно определить). Не должно быть очевидным, как перечислить все оставшиеся купоны из одного купонного кода - скажем,
MakeCoupon(n)
иMakeCoupon(n + 1)
должны визуально отличаться.например.
MakeCoupon(n),
, который просто выводитN
, заполненный нулями, не сможет выполнить это требование, потому что000001
и000002
фактически не отличаются "визуально".
Q
Существует ли какой-либо генератор функций или функций, который выполняет следующие требования? Мои попытки поиска приводят меня только к [CPAN]
CouponCode,, но это не полностью соответствует требованию биективности соответствующей функции.