Google App Engine中的密钥生成

3

如果你们曾经使用过Google App Engine,那么你们应该知道它为创建的每个模型实例都生成了一个密钥。这非常方便。

我正在考虑构建类似的东西。他们是基于内容来生成密钥呢?还是只是从a-zA-Z0-9中随机选择50次,然后将其组成一个字符串?后一种方法听起来很合理,因为两个密钥相同的概率低于1/10^89。

4个回答

3

仅仅使用随机值是不够的。虽然两个密钥相同的概率非常小,但随着生成的密钥数量增加,这种可能性会迅速增加。请参见生日悖论

在大多数情况下,这些密钥是通过包含几个值来保证唯一性生成的,例如MAC地址或生成它的服务器的某个序列号、时间戳、特殊计数器的值。


将生成时间戳作为前缀或后缀包含在键中是否是一个好主意? - Pwnna
这是你的选择。在我看来,最合乎逻辑的做法是先完成服务器相关部分,然后是时间戳,最后是计数器。计数器用于当密钥生成得太快以至于时间戳没有改变时。 - Eelke

1

您可以在此处找到有关如何构建通用唯一标识符的更多信息。

如果您想从php代码的一侧创建它,可以使用uniqid函数。更多信息请参见此处


1

App Engine中的键基于以下内容:

  1. 实体祖先实体的键(如果有)。

  2. 实体的种类名称。

  3. 自动生成的整数ID或用户分配的key_name。整数ID分配给应用程序的各个实例,以便它们可以保证是唯一的,但不能保证按单调递增的方式分配给实体。

键不使用任何类似于通用唯一标识符的东西。


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, ...)
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接