问题描述
|
如果您曾经使用过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,...)
...