Влияет ли путь документа на случайный идентификатор, автоматически сгенерированный Firestore? - PullRequest
0 голосов
/ 02 января 2019

Если я хочу узнать (случайный) идентификатор документа до сохранения его в Firestore (без написания пользовательского кода), я могу сделать следующее:

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

это имеет значение, если я дам "collection-name" в приведенном выше коде, но использую это id, чтобы сохранить документ в коллекции "some-other-collection"?

Другими словами, соответствует ли имя коллекции (или, в более общем случае, путьдокумента) имеют какое-либо отношение к случайному идентификатору, сгенерированному Firestore?

Генерируются ли идентификаторы Firestore аналогично тому, как описано в 2 ^ 120 способов обеспечения уникальных идентификаторов ?

Насколько хорош следующий код для автоматической генерации известных идентификаторов для документов Firestore:

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

1 Ответ

0 голосов
/ 02 января 2019

Идентификаторы документов, сгенерированные Cloud Firestore, генерируются на стороне клиента, совершенно случайно, и не зависят от коллекции, в которой вы их сгенерировали.

Вы можете убедиться в этом сами, если немного покопаться в (с открытым исходным кодом) SDK. Например, в Android SDK вот источник для CollectionReference.add():

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

Таким образом, генерация идентификатора оставляет методу 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();
}

Как уже говорилось: чисто случайность на стороне клиента с достаточной энтропией для обеспечения глобальной уникальности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...