Если вы просто хотите создать Guid, что начинает с письмом, вы могли бы сделать что-то вроде этого:
var b = Guid.NewGuid().ToByteArray();
b[3] |= 0xF0;
return new Guid(b);
Это всегда будет генерировать GUID, который начинается с шестигранной цифры F
.
Чтобы создать Guid, который не содержит любые номера вы можете использовать что-то вроде этого:
return new Guid(Guid.NewGuid().ToByteArray()
.Select(b => (byte)(((b % 16) < 10 ? 0xA : b) |
(((b >> 4) < 10 ? 0xA : (b >> 4)) << 4)))
.ToArray());
Это будет проверять каждую шестнадцатеричную цифру (два на один байт) и заставить его A
, если он меньше чем A
.
Оба эти решения порождают реальные объекты Guid
, хотя добавленные ограничения делают уменьшить уникальность полученных GUIDs до некоторой степени (в гораздо большей степени во втором примере). Если вы не заботитесь о том, что вывод является фактическим GUID, вы можете просто переустановить шестнадцатеричные цифры на что-то еще и вернуть результат строке, как предложили другие. FWIW, вот кратчайшее решение я могу думать:
return String.Concat(Guid.NewGuid().ToString("N").Select(c => (char)(c + 17)));
Это отображает шестнадцатеричные цифры от 0 до 9 для персонажей A
через J
, а шестнадцатеричные цифры A
- F
к персонажам r
через w
. Он также генерирует строку без дефиса. Это Например:
Before: e58d0f329a2f4615b922ecf53dcd090a
After: vFIuAwDCJrCwEGBFsJCCvtwFDutuAJAr
Конечно, вы могли бы преобразовать это в верхний или нижний случае, если вам не нравится смешанный случай здесь.
Уверены ли, что это будет гарантировано уникальным? –
@ HamletHakobyan: Даже GUID, полученные от 'Guid.NewGuid', без каких-либо искажений, не гарантируются как уникальные. Есть очень, очень, очень высокая вероятность. – cHao
@HamletHakobyan Это, безусловно, не так уникально, как обычный Guid, потому что вы ограничиваете GUID только меньшим подмножеством гидов. Даже GUID не гарантированы *, чтобы быть уникальными, только настолько уникальными, что вы не будете разумно ожидать найти дубликат в течение всего времени жизни Вселенной. Как уникально вам нужно, чтобы они зависели от приложения. –