Barry wrote:
HI,
I'm building a system where I wish to give my users a unique code each
time they perform a transaction. On returning to my system, they can
then enter this code to retreive the data associated with it.
I number my transactions in assending order, 0, 1, 2 and so on, so I
need a function that will transform this value to a unique nine digit
number. I also need a function that will transform this value back
again to the transaction number.
Something like this -
long codeTransactionNumber(long transactionNumber)
{
return transactionNumber + 100000000;
}
long uncodeTransactionNumber(long transactionNumber)
{
return transactionNumber - 100000000;
}
Thie problem with this though is that the user with the code
100-000-003 can easily guess that 100-000-004 is also a code for
another transaction. What would be a better way to generate this
number?
Also, I should point out that the number of clients that this system
has is very low - 5 per day max. Also, they enter the code using a
touch screen interface so entering many codes is difficult.
With such a low rate, you could use something simple like
System.currentTimeMillis() or Random#nextLong(). For the inverse,
use a Map<Long,Transaction>; this can also serve as a "memo pad"
to guard against the remote possibility of generating duplicates.
It seems to me that entering a nine-digit authentication code
on a touchscreen will be burdensome no matter what you do. Also,
it sounds like the users might interact with your system, get a
code, and then be expected to re-enter that code some substantial
time later. Do you print the number on a ticket they can carry
around, or do you just expect them to memorize it, or what? (If
you print tickets at a kiosk or something, I foresee a litter
problem.)
length of the ticket numbers. If there are only going to be 5
only a 5 in a million chance of hitting another valid number.