生成唯一的跟踪号码

时间:2009-11-01 06:46:41

标签: mysql ruby-on-rails ruby

我正在构建一个小型rails应用程序,我需要一种方法来生成跟踪号码,以便客户检查其状态。我想要一些类似于主要航运公司使用的东西,但不是那么久。我认为12-16个字符很长很好,但我不想要0000000001这样的东西,人们可以只输入递增的数字并窥视。

生成唯一的数字/字母组合跟踪代码的好方法是什么?

5 个答案:

答案 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的字段提供唯一键。这比手工操作更清洁,并且可以与您应用中的任意数量的模型一起使用。