Генератор полей случайного кода C # для объекта
-
10-07-2019 - |
Вопрос
У меня есть объект со следующими свойствами
ГИД
ID
Код
Имя
Некоторые клиенты не хотят вводить код, поэтому первоначальный план состоял в том, чтобы поместить идентификатор в код, но baseobject orm отличается, так что я, похоже, облажался...
мой план состоял в том, чтобы поместить ####-##### абсолютно случайные значения в код, как я могу сгенерировать что-то подобное, скажем, материал типа последовательного генератора Windows 7, но не будет ли это накладных расходов, что бы вы сделали в этом случае.
Решение
Вам нужно случайное значение или уникальное значение?
случайный!= уникальный.
Помните, что случайность просто указывает на вероятность нет генерация одного и того же значения или вероятность генерации одного и того же значения снова.С увеличением времени вероятность получения предыдущего значения возрастает, становясь практически достоверной.Что вам нужно?
Лично я рекомендую просто использовать Guid с некоторым контекстом [см. самый простой раздел ниже].Я также предоставил несколько других предложений, чтобы у вас были варианты, в зависимости от вашей ситуации.
самый простой
Если код представляет собой неограниченную строку [т. е. может быть любой длины], то самым простым получитаемым способом генерации уникального кода было бы
OrmObject ormObject= new OrmObject ();
string code = string.
Format ("{0} [{1}]", ormObject.Name, Guid.NewGuid ()).
Trim ();
// generates something like
// "My Product [DA9190E1-7FC6-49d6-9EA5-589BBE6E005E]"
вы можете заменить ormObject.Name
для любой различимой строки.Обычно я бы использовал typeof (objectInstance.GetType ()).Name
но это сработает только в том случае, если OrmObject является базовым классом, если это конкретный класс, используемый для все все они в конечном итоге будут иметь похожие теги.Смысл в том, чтобы добавить некоторый пользовательский контекст, такой, чтобы - как в упомянутом @Yuriy Faktorovich статья wtf - пользователи имеют что - то читать.
Случайный
День или два назад я ответил о генерации случайных чисел.Не так уж и много генерирующий числа как построение простой гибкой структуры вокруг генератора для улучшения качества кода и данных, это должно помочь оптимизировать ваш исходный код.
Если вы прочитаете это, вы могли бы легко написать метод расширения, скажем
public static class IRandomExtensions
{
public static CodeType GetCode (this IRandom random)
{
// 1. get as many random bytes as required
// 2. transform bytes into a 'Code'
// 3. bob's your uncle
...
}
}
// elsewhere in code
...
OrmObject ormObject = new OrmObject ();
ormObject.Code = random.GetCode ();
...
Чтобы действительно сгенерировать значение, я бы предложил реализовать IRandom
интерфейс с System.Security.Cryptography.RNGCryptoServiceProvider
реализация.Указанная реализация сгенерировала бы буфер из X случайных байт и выдавала бы столько, сколько требуется, восстанавливая поток при исчерпании.
Более того - я не знаю, почему я продолжаю писать, я думаю, что эта проблема действительно довольно увлекательна!- если тип кода - string и вы хотите что-то читаемое, вы могли бы просто взять указанные случайные байты и превратить их в "кажущуюся" читаемой строку с помощью преобразования Base64
public static class IRandomExtensions
{
// assuming 'CodeType' is in fact a string
public static string GetCode (this IRandom random)
{
// 1. get as many random bytes as required
byte[] randomBytes; // fill from random
// 2. transform bytes into a 'Code'
string randomBase64String =
System.Convert.ToBase64String (randomBytes).Trim ("=");
// 3. bob's your uncle
...
}
}
Вспомни
случайный!= уникальный.
Ваши ценности будет повторяю.В конце концов.
уникальный
Есть ряд вопросов, которые вам нужно задать себе по поводу вашей проблемы.
- Должны все
Code
значения должны быть уникальными?[если нет, то ты слишком стараешься] - Какой тип является
Code
?[если строка произвольной длины, используйте полный Guid] - Является ли это распределенным приложением?[если нет, используйте значение DB, как предложил @LBushkin выше]
- Если это распределенное приложение, могут ли клиентские приложения генерировать и отправлять экземпляры этих объектов?[если это так, то вам нужен глобально уникальный идентификатор, и, опять же, Guid - это верный выбор]
Я уверен, что у вас есть больше ограничений, но это пример того, какой запрос вам нужно выполнить, когда вы сталкиваетесь с проблемой, подобной вашей собственной.Исходя из этих вопросов, вы столкнетесь с рядом ограничений.Эти ограничения повлияют на ваш дизайн.
Надеюсь, это поможет :)
Кстати, вы получите решения более высокого качества, если опубликуете более подробную информацию [т.е. ограничения] о вашей проблеме.Опять же, что это за Тип Code
, существуют ли ограничения по длине?Ограничения формата?Ограничения характера?
Arg, последняя правка, я клянись.Если вы в конечном итоге используете Guid, вы можете запутать это или даже "сжать" их представление, закодировав их в base64 - аналогично приведенному выше преобразованию base64 для случайных чисел.
public static class GuidExtensions
{
public static string ToBase64String (this Guid id)
{
return System.Convert.
ToBase64String (id.ToByteArray ()).
Trim ("=");
}
}
В отличие от усечения, преобразование base64 выполняется нет трансформация, приводящая к потерям.Конечно, приведенная выше обработка приводит к потерям в контексте полного расширения base64, но =
это просто дополнение, введенная дополнительная информация Автор: преобразование, а не часть исходных данных Guid.Если ты хочешь уйти Назад в Guid из этого преобразованного значения base64, тогда вам придется переписывать строку base64 до тех пор, пока ее длина не станет кратной 4 - не спрашивайте, просто посмотрите base64, если вам интересно :)
Другие советы
Вы можете создать Guid, используя:
Guid.NewGuid().ToString();
Это даст вам что-то вроде:
788E94A0-C492-11DE-BFD4-FCE355D89593
Используйте столбец Autonumber или Sequencer из вашей базы данных, чтобы сгенерировать уникальный кодовый номер.Практически все современные базы данных в той или иной форме поддерживают автоматически генерируемые числа.Посмотрите, что поддерживает ваша база данных.
Значения автонумерации/секвенсора из БД гарантированно уникальны и их приобретение относительно недорогое.Если вы хотите избежать полностью последовательных номеров, присвоенных кодам, вы можете дополнить и объединить несколько значений секвенсора вместе.