文档的路径对 Firestore 自动生成的随机 ID 有影响吗?

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)

Fra*_*len 5

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)

如前所述:纯客户端随机性具有足够的熵以确保全局唯一性。

  • 这种实现在统计上是确定的,可以确保项目中的 ID 不会发生冲突?熵从哪里来?AFA 我可以看到,这只是“java.util.Random”的实现提供了熵。 (2认同)