【问题标题】:Generate numeric id for secondary identifier in django在 django 中为辅助标识符生成数字 id
【发布时间】:2016-04-20 08:41:02
【问题描述】:

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

类似这样的:

8230693489356

或者:

a435Ga256hb35

但不是:

ab66e4dd-4fee-4fb3-9519-efdc20e5d792

这不是重复的,因为:

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

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

  • 大部分答案都建议使用 UUID,这不是我想要的。

  • 这个问题只是要求一个唯一的 id,我要求的是特定的。

【问题讨论】:

标签: django


【解决方案1】:

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

我已将时间戳和主机名附加到随机生成的整数中。 既然你提到它不应该被轻易猜到,我已经用 md5 在 String 上面散列以生成最终密钥。

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'

【讨论】:

  • 你100%确定这是防碰撞的吗?如果有人在同一时间发帖怎么办?
  • @SebastianOlsen 如果有人同时从同一个主机名发帖。你有一组随机的 alphaNumeric 字符。当您将其与时间戳和主机名结合使用时,仅随机密钥的可能性本身是极不可能的。它应该非常独特。
  • TypeError: Unicode 对象必须在散列之前进行编码
  • @SebastianOlsen 我已经更新了代码,现在它适用于 python 2.7 和 3
  • 那么n 参数指定了什么?如果它确实指定了字符数,那就太好了。拥有一个相对较短但唯一的标识符正是我想要的。
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
相关资源
最近更新 更多