I want to implement a saving system similar to Imgur where if a user presses a button a unique 5 character value is returned. Here is what I have so far:
The database backend uses auto-incrementing ID’s starting at 5308416. I use a modified Radix function (see below) to convert these numerical ID’s into characters. I use a reverse function to lookup character ID’s back to numerical database ID’s.
function genID (value)
{
var alphabet = "23456789BCDFGHJKLMNPRSTVWXYZbcdfghjkmnpqrstvwxyz";
var result = "";
var length = alphabet.length;
while (value > 0)
{
result = alphabet[value % length] + result;
value = Math.floor (value / length);
}
return result;
}
The problem is that these generated ID’s are very much predictable. My question is, how can I make the generated ID’s seem random but still unique (so I can look them up in the database as numbers). I was thinking of using some encryption algorithm but not sure where to start. Any help or suggestions would be appreciated (maybe there is a better way of doing this also).
Do you have to be able to go both ways (i.e. convert an integer to it’s hash and back again)? If you can store the hash and lookup the content that way, then it’s relatively easy to create a function that produces a hard-to-guess, but complete hash space. You use primes to generate a sequence that only repeats once all possible permutations are exhausted.
The following PHP example is from my own code, adapted from this site:
It would be easy enough to implement that in JavaScript, but ideally you wouldn’t need too – you’d have an insert trigger on your table that populated a hash field with the result of that algorithm (adapted for SQL, of course).