Google App Engine中的密钥生成

问题描述

| 如果您曾经使用过Google App Engine。它为创建的模型的每个实例生成一个密钥。很整洁。 我正在考虑建立类似的东西。他们这样做是为了使密钥基于内容吗?还是只是从
a-zA-Z0-9
随机选择了50次,然后从中选出一个字符串?这听起来很合理,因为2个键相同的可能性低于1/10 ^ 89。     

解决方法

        仅使用随机值不会减少它。尽管两个密钥相同的机会很小,但随着密钥生成数量的增加,这种机会会迅速增加。见生日悖论。 在大多数情况下,这样的密钥是通过包含几个值(例如MAC地址或生成它的服务器的某个序列号),时间戳,特殊计数器的值来保证唯一性的方式生成的。     ,        您可以在此处找到有关如何构造通用唯一标识符的更多信息。 如果您想从代码的php端创建它,可以使用
uniqid
函数。更多信息在这里。     ,        App Engine中的键基于: 实体的祖先实体的键(如果有)。 实体的种类名称。 自动生成的整数ID或用户分配的key_name。整数ID在通常增加的块中分配给应用程序的各种实例,因此可以保证它们是唯一的,但不能保证实际上以单调递增的方式分配给实体。 这些键不使用任何通用的唯一ID。     ,        可能不是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,...)
...
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...