Вопрос

У меня есть объект со следующими свойствами


ГИД
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
        ...
    }
}

Вспомни

случайный!= уникальный.

Ваши ценности будет повторяю.В конце концов.


уникальный

Есть ряд вопросов, которые вам нужно задать себе по поводу вашей проблемы.

  1. Должны все Code значения должны быть уникальными?[если нет, то ты слишком стараешься]
  2. Какой тип является Code?[если строка произвольной длины, используйте полный Guid]
  3. Является ли это распределенным приложением?[если нет, используйте значение DB, как предложил @LBushkin выше]
  4. Если это распределенное приложение, могут ли клиентские приложения генерировать и отправлять экземпляры этих объектов?[если это так, то вам нужен глобально уникальный идентификатор, и, опять же, 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 из вашей базы данных, чтобы сгенерировать уникальный кодовый номер.Практически все современные базы данных в той или иной форме поддерживают автоматически генерируемые числа.Посмотрите, что поддерживает ваша база данных.

Значения автонумерации/секвенсора из БД гарантированно уникальны и их приобретение относительно недорогое.Если вы хотите избежать полностью последовательных номеров, присвоенных кодам, вы можете дополнить и объединить несколько значений секвенсора вместе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top