2011-05-28 53 views
3

如果你们曾经使用Google App Engine。它为每个创建的模型实例生成一个键。它非常整齐。Google App Engine中的密钥生成

我正在研究构建这样的东西。他们是否这样做是为了让关键是基于内容?或者他们只是从a-zA-Z0-9中随机选择50次,并从中建立一个字符串?这听起来很合理,因为2键的机会将会相同,低于1/10^89。

回答

3

只使用随机值不会削减它。虽然两个密钥相同的可能性非常小,但随着密钥数量的增加,可能性会迅速增加。请参阅birthday paradox

在大多数情况下,通过包含多个值(如MAC地址或生成它的服务器的某个序列号),时间戳(一个特殊计数器的值)来确保唯一性。

+0

因此,将生成时间的时间戳作为前缀或后缀包含在密钥中是一个好主意吗? – Pwnna 2011-05-28 17:00:06

+0

这是您的选择。对我来说,最合理的做法是首先执行服务器相关部分,然后执行时间戳,然后执行计数器。计数器用于当密钥生成得如此之快时,时间戳不会改变。 – Eelke 2011-05-29 04:17:17

0

可能不是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, ...) 
... 
1

您可以找到有关被如何通用唯一标识符构建here更多信息。

如果你想从PHP代码创建它,你可以使用uniqid函数。更多信息here

1

键在App Engine中基于:

  1. 实体的祖先实体的按键,如果有的话。

  2. 实体的种类名称。

  3. 自动生成的整数ID或用户分配的key_name。整数ID以通常增加的块的形式分配给应用程序的各种实例,因此它们可以保证是唯一的,但不能保证实际上以单调递增的方式分配给实体。

这些键不使用任何通用唯一ID。

+0

这应该是被接受的答案:) – Lipis 2011-10-18 23:57:45

相关问题