Python googleappengine中的密钥生成

Python googleappengine中的密钥生成,python,google-app-engine,Python,Google App Engine,如果你们用过谷歌应用引擎。它为所创建模型的每个实例生成一个键。它很整洁 我正在考虑建造类似的东西。他们这样做是因为密钥是基于内容的吗?或者他们只是从a-zA-Z0-9中随机选择50次,然后从中构建一个字符串?这听起来很合理,因为两个键相同的几率会低于1/10^89。仅仅使用随机值并不能减少它。虽然两个密钥相同的可能性非常小,但随着生成的密钥数量的增加,这种可能性迅速增加。看 在大多数情况下,生成此类密钥的方式保证了唯一性,方法是包含多个值,如MAC地址或生成密钥的服务器的某个序列号、时间戳、特殊

如果你们用过谷歌应用引擎。它为所创建模型的每个实例生成一个键。它很整洁


我正在考虑建造类似的东西。他们这样做是因为密钥是基于内容的吗?或者他们只是从
a-zA-Z0-9
中随机选择50次,然后从中构建一个字符串?这听起来很合理,因为两个键相同的几率会低于1/10^89。

仅仅使用随机值并不能减少它。虽然两个密钥相同的可能性非常小,但随着生成的密钥数量的增加,这种可能性迅速增加。看


在大多数情况下,生成此类密钥的方式保证了唯一性,方法是包含多个值,如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, ...)
...

您可以找到有关如何构造通用唯一标识符的更多信息


如果要从代码的php端创建它,可以使用
uniqid
函数。更多信息。

应用程序引擎中的键基于:

  • 实体的祖先实体的键(如果有)

  • 实体的种类名称

  • 自动生成的整数id或用户指定的密钥名称。整数ID通常以递增的块分配给应用程序的各个实例,因此可以保证它们是唯一的,但不能保证以单调递增的方式实际分配给实体


  • 密钥不使用任何通用唯一ID。

    因此,将生成时间的时间戳作为前缀或后缀包含到密钥中是一个好主意吗?这是您的选择。在我看来,首先做依赖于服务器的部分,然后是时间戳,然后是计数器,这是最符合逻辑的。计数器用于密钥生成速度如此之快,时间戳不会改变的情况。