文档的路径与Firestore自动生成的随机ID有关系吗?

时间:2019-01-02 13:37:34

标签: java google-app-engine google-cloud-firestore id-generation

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

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

如果我在上面的代码中给"collection-name"但使用那个id将文档保存到集合"some-other-collection",会有所不同吗?

换句话说,集合名称(或更笼统地说,是文档的路径)与Firestore生成的随机ID有什么关系吗?

生成的Firestore ID是否类似于The 2^120 Ways to Ensure Unique Identifiers中所述?

以下代码对于为Firestore文档自动生成已知ID有多好?

private static SecureRandom RANDOMIZER = new SecureRandom();
.
.
.
byte[] randomId = new byte[120];
RANDOMIZER.nextBytes(randomId);
// Base64-encode randomId

1 个答案:

答案 0 :(得分:1)

Cloud Firestore生成的文档ID是在客户端生成的,完全是随机的,并且与生成它们的集合无关。

如果您深入研究(开放源代码)SDK,则可以自己看到。例如,在Android SDK中,这是source for CollectionReference.add()

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

因此,将ID生成留给了document method

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

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