Случайное число шестизначных идентификаторов для контента в веб-приложении - PullRequest
0 голосов
/ 16 апреля 2011

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 16 апреля 2011

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

Вместо создания словаря со всеми возможными значениями, 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).

0 голосов
/ 16 апреля 2011

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

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

0 голосов
/ 16 апреля 2011

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

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

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

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

...