I am building a small rails app and I need a way to generate tracking numbers to give to customers to check up on their status. I want something similar to what the major s
I wrote a plugin for this sort of scenario called acts_as_hashed (on github). You can specify which fields you'd like to use in the hashing algorithm and the plugin will provide a unique key based on those fields called crypto_hash. This tends to be cleaner than by doing it by hand, and can be used with any number of models within your app.
Isn't the id generated for every table enough? It is unique by "default". But most of the time it's simply not shown,
Of course one could wrap it in a timestamp or the like.
Why not use a hashmap to store the order information and provide the users with a decimal/hex representation of the ID? It's unique enough.
SELECT HEX(encode(id,'pass_str')) FROM table;
SELECT * FROM table WHERE id=decode(UNHEX('1F68C22821F2AC'), 'pass_str');
For meaningless data, hashes of the time plus a salt are always rock solid, and can't be guessed easily (forgive the Python, I've heard of this Ruby thing but never held it in my hands):
>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()
'7a8b73fa7e0dadf246612e6001ede165'
Shorten it, if you like:
>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:16]
'46ffb69ebc96412d'
Use an integer instead, if you like, but the length has the chance to vary with this code, unless you zero-pad:
>>> int(hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:13], 16)
1346212029197308
In before "zomg md5 isn't crypto secure":
>>> int(hashlib.sha256(str(time.time()) + "!salt!").hexdigest()[:13], 16)
1948411134966366
Hell, you don't even have to use time, you can use an autoincrementing integer, as long as you salt it:
>>> int(hashlib.sha256(str(1) + "!salt!").hexdigest()[:13], 16)
1269883740611281
>>> int(hashlib.sha256(str(2) + "!salt!").hexdigest()[:13], 16)
3655373802716929
Hashes. Is there anything they can't do?