Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 分配一个随机Id以在实体构造函数Google App Engine中使用_Google App Engine_Google Cloud Endpoints_Google Cloud Datastore_Objectify - Fatal编程技术网

Google app engine 分配一个随机Id以在实体构造函数Google App Engine中使用

Google app engine 分配一个随机Id以在实体构造函数Google App Engine中使用,google-app-engine,google-cloud-endpoints,google-cloud-datastore,objectify,Google App Engine,Google Cloud Endpoints,Google Cloud Datastore,Objectify,在数据存储中插入具有@id Long id的实体时

在数据存储中插入具有
@id Long id的实体时5490350115034675

我想自己设置
Long
id,但它是从数据存储中随机生成的

我发现这段代码似乎就是这样做的:

 Key<MyEntity> entityKey = factory().allocateId(MyEntity.class);
 Long commentId = entityKey.getId();
Key entityKey=factory().allocateId(MyEntity.class);
Long commentId=entityKey.getId();
然后我可以将
commentId
传递到
MyEntity
的构造函数中,然后将其保存到数据存储中

然而,当我这样做时,我似乎没有得到随机生成的id,它似乎遵循一些奇怪的模式,第一个分配的id是
1
,下一个是
10002
,然后是
20001
,依此类推


不知道这意味着什么,如果继续使用是安全的。。。这是唯一的方法吗?

应用程序引擎使用自己的内部算法分配ID,该算法旨在提高数据存储性能。我相信应用引擎团队会发挥他们的魔力


引入您自己的ID分配方案并不是那么简单-您必须考虑最终的一致性等,而且您不太可能从所有这些努力中获得任何性能方面的好处。

App Engine使用其内部算法分配ID,该算法旨在提高数据存储性能。我相信应用引擎团队会发挥他们的魔力


引入您自己的ID分配方案并不是那么简单-您必须考虑最终的一致性等,而且您不太可能从所有这些努力中获得任何性能方面的好处。

当您使用自动生成的ID(即长ID)时,GAE使用“分散的”id生成器,它可以从广泛的键空间中提供id。这是因为索引中或多或少连续值的大量写入(每秒数千次)会导致大量表拆分,从而影响性能

当您使用
allocateId()
时,您会从分散id之前使用的旧分配器中获得一个id。它们不一定是连续的或单调的,但它们往往从小处开始生长

你可以混搭;分配永远不会冲突


然而,我假设您想要随机外观的ID,因为您希望它们难以猜测。尽管分散的id分配器乍一看外观很好,但它不会生成不可用的id。如果您希望稀疏ID阻止某人扫描您的键空间,则需要显式添加一个随机元素。或者首先使用UUID.randomUUID()。

当您使用自动生成的id(即长id)时,GAE使用“分散”id生成器,它可以从广泛的键空间中为您提供id。这是因为索引中或多或少连续值的大量写入(每秒数千次)会导致大量表拆分,从而影响性能

当您使用
allocateId()
时,您会从分散id之前使用的旧分配器中获得一个id。它们不一定是连续的或单调的,但它们往往从小处开始生长

你可以混搭;分配永远不会冲突



然而,我假设您想要随机外观的ID,因为您希望它们难以猜测。尽管分散的id分配器乍一看外观很好,但它不会生成不可用的id。如果您希望稀疏ID阻止某人扫描您的键空间,则需要显式添加一个随机元素。或者首先使用UUID.randomUUID()。

为什么需要随机ID?@AndreiVolgin似乎是正确的选择=P你是说这不重要吗?@MicroR你不想要随机ID,你想要安全且未使用的ID。此外,allocateId不是随机的,它是一种数据存储功能,为您的实体提供了一个安全的使用id。所以使用起来很安全。您看到的模式来自数据存储,因为它通常分配整个ID块。它在现场环境中看起来会有所不同。@konqi我不想要随机ID。我想要安全的未使用的身份证,就像那样。尽管您可以省略
=
,因为这是默认值。使用objectify时,
userKey
必须是
Key
Ref
。为什么需要随机ID?@anderivolgin似乎是正确的选择=P你是说这不重要吗?@MicroR你不想要随机ID,你想要安全且未使用的ID。此外,allocateId不是随机的,它是一种数据存储功能,为您的实体提供了一个安全的使用id。所以使用起来很安全。您看到的模式来自数据存储,因为它通常分配整个ID块。它在现场环境中看起来会有所不同。@konqi我不想要随机ID。我想要安全的未使用的身份证,就像那样。尽管您可以省略
=
,因为这是默认值。使用objectify时,
userKey
必须是
Key
Ref
是否可以安全使用,并且不会与任何内容发生冲突(例如,给我一个已经在数据存储中或在程序中的其他位置分配的ID)?这既安全又不必要:)您应该有提前分配ID的特定原因。否则,只需创建一个实体,数据存储将为其提供一个安全ID,该ID对于实体组中的这种实体类型而言是唯一的。您传递的不是3个数字,而是包含这3个数字的很长字符串(websafeKey)。通常,您只需使用简单的JSON传递包含Post ID和用户ID的注释实体(如有必要)。不需要这种额外的复杂性。这是两个独立的问题。如果创建一个
类WrapperAB{aaa;bb;}