Mysql 生成唯一跟踪编号

Mysql 生成唯一跟踪编号,mysql,ruby-on-rails,ruby,Mysql,Ruby On Rails,Ruby,我正在开发一个小型rails应用程序,我需要一种生成跟踪号码的方法,以便提供给客户检查他们的状态。我想要一些类似于主要航运公司所用的东西,但不要那么长。我认为12-16个字符长是可以的,但我不想要像0000000001这样的东西,人们可以输入递增的数字,然后四处窥视 生成唯一的数字/字母组合跟踪代码的好方法是什么?为每个表生成的id还不够吗?默认情况下,它是唯一的。但大多数时候它只是没有显示出来 当然可以用时间戳之类的东西来包装它。对于无意义的数据,时间加盐的散列总是坚如磐石,不容易猜测(请原谅

我正在开发一个小型rails应用程序,我需要一种生成跟踪号码的方法,以便提供给客户检查他们的状态。我想要一些类似于主要航运公司所用的东西,但不要那么长。我认为12-16个字符长是可以的,但我不想要像0000000001这样的东西,人们可以输入递增的数字,然后四处窥视


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

为每个表生成的id还不够吗?默认情况下,它是唯一的。但大多数时候它只是没有显示出来


当然可以用时间戳之类的东西来包装它。

对于无意义的数据,时间加盐的散列总是坚如磐石,不容易猜测(请原谅Python,我听说过这个Ruby东西,但从来没有拿过它):

如果您愿意,请将其缩短:

>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:16]
'46ffb69ebc96412d'
如果愿意,可以使用整数,但长度可能会随此代码的变化而变化,除非使用零填充:

>>> int(hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:13], 16)
1346212029197308
在“ZomgMD5不是加密安全的”之前:

见鬼,你甚至不需要使用时间,你可以使用一个自动递增的整数,只要你使用它:

>>> int(hashlib.sha256(str(1) + "!salt!").hexdigest()[:13], 16)
1269883740611281
>>> int(hashlib.sha256(str(2) + "!salt!").hexdigest()[:13], 16)
3655373802716929

散列。有什么他们不能做的吗?

为什么不使用hashmap来存储订单信息,并为用户提供ID的十进制/十六进制表示?它非常独特。

我为这种场景编写了一个插件,名为acts\u as\u hashed()。您可以指定要在哈希算法中使用的字段,插件将根据这些字段提供一个名为crypto_hash的唯一密钥。这比手工操作更干净,并且可以与应用程序中的任何型号一起使用。

散列常用方法?如果要减少ID中的字符数,请考虑对代码进行base32或base64编码。如果要在跟踪号码中嵌入某种程度的日期信息,可以在随机散列的前几位加上数字前缀十进制形式的unix时间。前6位数字将唯一标识大约3小时的时间。这将使你的跟踪代码半连续(例如,这将在排序记录时提供有用的属性)。@wedge谢谢你的好主意,再次因为睡眠不足,我的脑袋里不会出现这种情况。@wedge:是的,哈希只是一个开始,真的。好主意。谢谢->用c重新实现了一个类似的东西,使用GUID、SHA256和一个位掩码来创建我需要的数字。
SELECT HEX(encode(id,'pass_str')) FROM table;
SELECT * FROM table WHERE id=decode(UNHEX('1F68C22821F2AC'), 'pass_str');
>>> int(hashlib.sha256(str(1) + "!salt!").hexdigest()[:13], 16)
1269883740611281
>>> int(hashlib.sha256(str(2) + "!salt!").hexdigest()[:13], 16)
3655373802716929
SELECT HEX(encode(id,'pass_str')) FROM table;
SELECT * FROM table WHERE id=decode(UNHEX('1F68C22821F2AC'), 'pass_str');