分配随机Id以在Entity构造函数Google App Engine中使用

时间:2016-01-19 17:36:05

标签: google-app-engine google-cloud-endpoints google-cloud-datastore objectify

当您将实体插入具有@id Long id;属性的数据存储区时,数据存储区会自动创建一个随机(或似乎是随机的)Long值作为ID:5490350115034675

我想自己设置Long ID,但要从数据存储中随机生成。

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

 Key<MyEntity> entityKey = factory().allocateId(MyEntity.class);
 Long commentId = entityKey.getId();

然后我可以将commentId传递给MyEntity的构造函数,然后将其保存到数据存储区。

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

不确定这意味着什么,以及继续使用是否安全......这是唯一的方法吗?

2 个答案:

答案 0 :(得分:2)

当您使用自动生成的ID(即Long)时,GAE使用“分散的”#39; id生成器,它为您提供来自各种键空间的ID。这是因为索引中的大量写入(每秒数千个)或多或少的连续值会导致大量表格分裂,从而损害性能。

当您使用allocateId()时,您会从分散的ID之前使用的旧分配器中获取ID。它们不一定是连续的或单调的,但它们往往从小开始并且不断增长。

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

但是,我认为你想要看起来像随机的ID,因为你希望它们难以猜测。尽管它们在第一眼看上去,但是分散的id分配器不会产生不可思议的id。如果你想要稀疏的id会阻止某人扫描你的键空间,你需要显式添加一个随机元素。或者首先使用UUID.randomUUID()。

答案 1 :(得分:1)

App Engine使用自己的内部算法分配ID,旨在提高数据存储性能。我相信App Engine团队可以发挥他们的魔力。

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