I would like to generate coupon codes , e.g. AYB4ZZ2. However, I would also like to be able to mark the used coupons and limit their global number, let's say N. The naive approach would be something like "generate N unique alphanumeric codes, put them into database and perform a db search on every coupon operation."
However, as far as I realize, we can also attempt to find a function MakeCoupon(n), which converts the given number into a coupon-like string with predefined length.
As far as I understand, MakeCoupon should fullfill the following requirements:
Be bijective. It's inverse
MakeNumber(coupon)should be effectively computable.Output for
MakeCoupon(n)should be alphanumeric and should have small and constant length - so that it could be called human readable. E.g.SHA1digest wouldn't pass this requirement.Practical uniqueness. Results of
MakeCoupon(n)for every naturaln <= Nshould be totally unique or unique in the same terms as, for example,MD5is unique (with the same extremely small collision probability).(this one is tricky to define) It shouldn't be obvious how to enumerate all remaining coupons from a single coupon code - let's say
MakeCoupon(n)andMakeCoupon(n + 1)should visually differ.E.g.
MakeCoupon(n),which simply outputsnpadded with zeroes would fail this requirement, because000001and000002don't actually differ "visually".
Q:
Does any function or function generator, which fullfills the following requirements, exist? My search attempts only lead me to [CPAN] CouponCode, but it does not fullfill the requirement of the corresponding function being bijective.