如果你们曾经使用Google App Engine。它为每个创建的模型实例生成一个键。它非常整齐。Google App Engine中的密钥生成
我正在研究构建这样的东西。他们是否这样做是为了让关键是基于内容?或者他们只是从a-zA-Z0-9
中随机选择50次,并从中建立一个字符串?这听起来很合理,因为2键的机会将会相同,低于1/10^89。
如果你们曾经使用Google App Engine。它为每个创建的模型实例生成一个键。它非常整齐。Google App Engine中的密钥生成
我正在研究构建这样的东西。他们是否这样做是为了让关键是基于内容?或者他们只是从a-zA-Z0-9
中随机选择50次,并从中建立一个字符串?这听起来很合理,因为2键的机会将会相同,低于1/10^89。
只使用随机值不会削减它。虽然两个密钥相同的可能性非常小,但随着密钥数量的增加,可能性会迅速增加。请参阅birthday paradox。
在大多数情况下,通过包含多个值(如MAC地址或生成它的服务器的某个序列号),时间戳(一个特殊计数器的值)来确保唯一性。
可能不是100%的唯一的,但是我用的是这样的:
def get_unique_id_str():
import binascii
import uuid
table = ''.join(chr(i) for i in xrange(256))
return binascii.b2a_base64(uuid.uuid4().bytes).translate(table, '/+=\n')
key_name = get_unique_id_str()
instance = MyModel(key_name=key_name, ...)
...
键在App Engine中基于:
实体的祖先实体的按键,如果有的话。
实体的种类名称。
自动生成的整数ID或用户分配的key_name。整数ID以通常增加的块的形式分配给应用程序的各种实例,因此它们可以保证是唯一的,但不能保证实际上以单调递增的方式分配给实体。
这些键不使用任何通用唯一ID。
这应该是被接受的答案:) – Lipis 2011-10-18 23:57:45
因此,将生成时间的时间戳作为前缀或后缀包含在密钥中是一个好主意吗? – Pwnna 2011-05-28 17:00:06
这是您的选择。对我来说,最合理的做法是首先执行服务器相关部分,然后执行时间戳,然后执行计数器。计数器用于当密钥生成得如此之快时,时间戳不会改变。 – Eelke 2011-05-29 04:17:17