生成唯一的跟踪号码

Joe*_*oey 3 ruby mysql ruby-on-rails

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

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

Jed*_*ith 14

对于无意义的数据,时间加上盐的哈希总是坚如磐石,并且不能轻易猜到(原谅Python,我听说过这个Ruby的东西,但从来没有把它拿在手里):

>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()
'7a8b73fa7e0dadf246612e6001ede165'
Run Code Online (Sandbox Code Playgroud)

缩短它,如果你喜欢:

>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:16]
'46ffb69ebc96412d'
Run Code Online (Sandbox Code Playgroud)

如果您愿意,请使用整数,但长度有可能随此代码而变化,除非您使用零填充:

>>> int(hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:13], 16)
1346212029197308
Run Code Online (Sandbox Code Playgroud)

在"zomg md5不加密安全"之前:

>>> int(hashlib.sha256(str(time.time()) + "!salt!").hexdigest()[:13], 16)
1948411134966366
Run Code Online (Sandbox Code Playgroud)

地狱,你甚至不必使用时间,你可以使用自动增量整数,只要你加盐:

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

哈希值.他们有什么不能做的吗?

  • 如果您希望在跟踪号中嵌入一定程度的日期信息,您可以在随机哈希前面加上十进制形式的unix-time的前几位数字.前6位数字将唯一地标识大约3小时的时间.这会产生额外的效果,即使您的跟踪代码成为半连续的(例如,这将为排序记录提供有用的属性). (4认同)