在django中为辅助标识符生成数字ID

时间:2016-04-20 08:41:03

标签: django

我想为每个模型生成一个碰撞检查,完全唯一的数字ID。我不能使用自动递增id的原因是因为我不希望id可以预测。我也想避免使用UUID,但我也可以使用字母数字ID。我没有替换主键,但我正在使用它来获取API中的对象

这样的事情:

8230693489356

或者:

a435Ga256hb35

但不是:

ab66e4dd-4fee-4fb3-9519-efdc20e5d792

这不重复,因为:

  • 提出的问题并没有解决我的问题,也没有解决问题,也没有接受答案。

  • 最佳答案不会创建碰撞检查唯一ID,可能会发生碰撞

  • 大多数答案都提示UUID,这不是我想要的。

  • 问题只是要求一个唯一的ID,我要求具体的东西。

1 个答案:

答案 0 :(得分:0)

因为你想成为唯一的身份证而不仅仅是另一个随机身份

我已将Timestamp和主机名附加到随机生成的Integer中。 既然你提到它不容易被猜到我已经用字符串md5进行了哈希,以生成最终的密钥。

import hashlib
import random
import time
import string
import socket
import sys
hostname = socket.gethostname()
def new_id(n):
    return hashlib.md5((str(random.randint(1,sys.maxsize))+hostname+str(time.time()*1000)).encode('utf-8')).hexdigest()[:n]

>>> new_id(11)
'8c05917c1c7'