mar*_*gti 0 java google-app-engine id-generation google-cloud-firestore
如果我想在将文档保存到 Firestore之前了解其(随机)ID (无需编写自定义代码),我可以执行以下操作:
String id = db.collection("collection-name").document().getId();
Run Code Online (Sandbox Code Playgroud)
"collection-name"如果我提供上面的代码但使用它来id将文档保存到集合中,会有什么不同吗"some-other-collection"?
换句话说,集合名称(或者更一般地说,文档的路径)对 Firestore 生成的随机 ID 有任何影响吗?
Firestore ID 的生成方式是否与确保唯一标识符的 2^120 种方法中描述的类似?
以下代码对于自动生成 Firestore 文档的已知 ID 有多好:
private static SecureRandom RANDOMIZER = new SecureRandom();
.
.
.
byte[] randomId = new byte[120];
RANDOMIZER.nextBytes(randomId);
// Base64-encode randomId
Run Code Online (Sandbox Code Playgroud)
Cloud Firestore 生成的文档 ID 是在客户端生成的,完全随机,并且不依赖于您生成它们的集合。
如果您深入研究(开源)SDK,您可以亲自看到这一点。例如,在 Android SDK 中,以下是 的源代码CollectionReference.add():
final DocumentReference ref = document();
return ref.set(data)
Run Code Online (Sandbox Code Playgroud)
这样就将 ID 的生成留给了该document方法:
public DocumentReference document() {
return document(Util.autoId());
}
Run Code Online (Sandbox Code Playgroud)
哪些代表Util.autoId():
private static final int AUTO_ID_LENGTH = 20;
private static final String AUTO_ID_ALPHABET =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final Random rand = new Random();
public static String autoId() {
StringBuilder builder = new StringBuilder();
int maxRandom = AUTO_ID_ALPHABET.length();
for (int i = 0; i < AUTO_ID_LENGTH; i++) {
builder.append(AUTO_ID_ALPHABET.charAt(rand.nextInt(maxRandom)));
}
return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)
如前所述:纯客户端随机性具有足够的熵以确保全局唯一性。
| 归档时间: |
|
| 查看次数: |
355 次 |
| 最近记录: |