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