0

如果我想在将文档保存到 Firestore(不编写自定义代码)之前知道文档的(随机)ID,我可以执行以下操作:

String id = db.collection("collection-name").document().getId();

如果我"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
4

1 回答 1

3

Cloud Firestore 生成的文档 ID 是在客户端生成的,完全随机,不依赖于您在其中生成它们的集合。

如果您深入了解(开源)SDK,您可以自己看到这一点。例如,在 Android SDK 中,源代码CollectionReference.add()如下:

final DocumentReference ref = document();
return ref.set(data)

这样就将 ID 生成留给了document方法

public DocumentReference document() {
  return document(Util.autoId());
}

代表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();
}

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

于 2019-01-02T15:00:37.677 回答