我正在构建一个小型rails应用程序,我需要一种方法来生成跟踪号码,以便客户检查其状态。我想要一些类似于主要航运公司使用的东西,但不是那么久。我认为12-16个字符很长很好,但我不想要0000000001这样的东西,人们可以只输入递增的数字并窥视。
生成唯一的数字/字母组合跟踪代码的好方法是什么?
答案 0 :(得分:14)
对于无意义的数据,时间加上盐的哈希总是坚如磐石,并且无法轻易猜到(原谅Python,我已经听到了这个Ruby的东西但从未持有它在我手中):
>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()
'7a8b73fa7e0dadf246612e6001ede165'
如果您愿意,请缩短它:
>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:16]
'46ffb69ebc96412d'
如果您愿意,请使用整数,但长度有可能随此代码而变化,除非您使用零填充:
>>> int(hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:13], 16)
1346212029197308
之前“zomg md5不是加密安全”:
>>> int(hashlib.sha256(str(time.time()) + "!salt!").hexdigest()[:13], 16)
1948411134966366
天啊,你甚至不必使用时间,你可以使用自动增量整数,只要你加盐:
>>> int(hashlib.sha256(str(1) + "!salt!").hexdigest()[:13], 16)
1269883740611281
>>> int(hashlib.sha256(str(2) + "!salt!").hexdigest()[:13], 16)
3655373802716929
散列。他们不能做什么吗?
答案 1 :(得分:0)
是不是每个表都生成了足够的id? “默认”是唯一的。但大部分时间它都没有显示,
当然可以将它包装在时间戳等中。
答案 2 :(得分:0)
为什么不使用散列图来存储订单信息并为用户提供ID的十进制/十六进制表示?它足够独特。
答案 3 :(得分:0)
SELECT HEX(encode(id,'pass_str')) FROM table;
SELECT * FROM table WHERE id=decode(UNHEX('1F68C22821F2AC'), 'pass_str');
答案 4 :(得分:0)
我为这种方案编写了一个名为acts_as_hashed(on github)的插件。您可以指定要在散列算法中使用哪些字段,插件将根据名为crypto_hash的字段提供唯一键。这比手工操作更清洁,并且可以与您应用中的任意数量的模型一起使用。