Вот код, который генерирует новый GUID, если вы отключите автоматическую генерацию.
Этот код взят путем обратного проектирования эмулятора CosmosDB и извлечения кода движка Javascript.
// generate GUID
function getHexaDigit() {
return Math.floor(Math.random() * 16).toString(16);
}
function generateGuidId() {
var id = "";
for (var i = 0; i < 8; i++) {
id += getHexaDigit();
}
id += "-";
for (var i = 0; i < 4; i++) {
id += getHexaDigit();
}
id += "-";
for (var i = 0; i < 4; i++) {
id += getHexaDigit();
}
id += "-";
for (var i = 0; i < 4; i++) {
id += getHexaDigit();
}
id += "-";
for (var i = 0; i < 12; i++) {
id += getHexaDigit();
}
return id;
}
Судя по этому, генерация на стороне сервера происходит быстрее, потому что она не учитывает то, что учитывает C # Guid.NewGuid()
, а вместо этого просто выполняет RNG.
Guid.NewGuid()
фактически примет во внимание больше вещей, чтобы сгенерировать это значение.
- MAC-адрес машины, использованной для генерации GUID
- Отметка
- Дополнительные "аварийные биты Uniquifier"
- Идентификатор алгоритма
Имейте в виду, что это верно только в том случае, если служба Azure CosmosDB использует тот же код JS с эмулятором (что я лично считаю, но гарантии нет).
В заключение, автоматическая генерация идентификатора - это скорее функция качества жизни, которая дает больше контроля разработчику, чем то, что может улучшить или ухудшить производительность приложения (или пропускную способность). Это сводится к следующему. Если логично иметь идентификатор в составе DTO, используйте его. Если нет, то удалите его. Имейте в виду, однако, что для работы Replace
и Upsert
требуется id
.
РЕДАКТИРОВАТЬ: Кроме того, читая ваш вопрос еще раз, вы звучите так, что если разработчик устанавливает id
вручную и автоматическая генерация не отключена, CosmosDB автоматически сгенерирует новый идентификатор поверх указанного. Это неправда. Если вы установите id
вручную, идентификатор не будет переопределен CosmosDB, независимо от настройки.