Случайные шестизначные идентификаторы контента в веб-приложении

Я пытаюсь реализовать принятый ответ из этот вопрос для генерации идентификатора и использование XML-файлов для хранения моего контента и таблицы идентификаторов контента.

Идея состоит в том, что каждый элемент контента будет храниться (сериализоваться) как my-content-item-slug-374871.xml, где число — это случайный идентификатор, который элементу контента будет присвоен из таблицы идентификаторов (из тех, которые не пока не принято). Мое требование состоит в том, чтобы идентификатор был шестизначным числом (требования к отображению) от 100000 до 999999, поэтому фактически мы сможем создать только 899999 элементов контента, но этого должно быть достаточно. Если вам интересно, почему такое требование, я могу только сказать, что мне не нужны идентификаторы, начинающиеся с нуля, и мне не нужны идентификаторы, такие как GUID (которые было бы намного проще создавать и поддерживать, я знаю), потому что идентификатор будет используется в маршрутах MVC (так же, как URL-адреса SO).

Итак, для начала я решил создать словарь, где ключ — это идентификатор, а значение определяет, используется он или нет (true, если используется, false, если доступно). Затем я сериализую этот объект в файл XML, используя DataContractSerializer.

Файл имеет размер 72 МБ, и здесь, я думаю, начинают проявляться проблемы. Прежде всего, я только что попытался открыть этот файл в VS2010, Блокноте, Wordpad и IE, и все они разбились, а потребление памяти резко возросло. Но у приложения вроде с этим проблем нет. Тем не менее, я думаю, что это будет огромный объем памяти, а производительность процессора пострадает.

Прав ли я в своих предположениях, и если да, то какие у меня есть другие варианты?


person mare    schedule 16.04.2011    source источник
comment
Notepad++ может сохранить этот файл без сбоев.   -  person Mark Richman    schedule 16.04.2011


Ответы (3)


для начала я решил создать словарь,

Вы обнаружите, что BitArray занимает гораздо меньше места.

Но основной вопрос: почему «случайный»?

Если вам нужны уникальные идентификаторы, просто используйте счетчик. Начните с 100000 и увеличивайте каждый раз, когда вы его используете.

person Henk Holterman    schedule 16.04.2011

Я бы предложил то же самое, что и Хенк (просто используйте последовательные, заполненные идентификаторы), однако вы можете выполнить то, что ищете:

Вместо того, чтобы создавать словарь со всеми возможными значениями, GenericList только со значениями, которые были использованы, будет менее интенсивным:

static class Static
{
    static List<int> UsedIds = new List<int>();
}

Затем повторяйте, пока не найдете тот, который еще не использовался. (Случайные, вероятно, не лучший выбор, если вы не используете их независимо от часов).

int GetNewId()
{
    Random rand = new Random();
    while (true)
    {
        int newId = rand.Next(100000, 999999);
        if (!Static.UsedIDs.Contains(newId))
        {
            Static.UsedIDs.Add(newId);
            return newId;
        }
    }
}

Это должно быть более эффективным в краткосрочной перспективе, но для долгосрочной производительности и масштабируемости я бы настоятельно предложил использовать заполненные удостоверения или идентификаторы GUID, которые можно использовать, когда Кодировка Base-64 (аналогично URL-адресам YouTube).

person lukiffer    schedule 16.04.2011
comment
Если у вас есть проблемы (а я предполагаю, что они будут), переместите эту строку: Random rand = new Random(); вне цикла. - person Steve Wellens; 16.04.2011
comment
Обновленный ответ по предложению Стива Велленса. - person lukiffer; 16.04.2011

Вместо того, чтобы поддерживать список используемых номеров, просто создайте новое имя файла и выполните вызов File.Exists(fileName), если он не существует, он не используется.

Редактировать: Извините, предположил, что язык C#, но идея должна быть похожа на другие языки.

person Chuck Savage    schedule 16.04.2011