Подтвердить что ты не робот

Способ создания уникального числа, которое не повторяется в разумные сроки?

Я интегрирую/тестирую с помощью удаленной веб-службы, и даже если это конечная точка "QA", она по-прежнему обеспечивает уникальный адрес электронной почты для каждого вызова.

Я могу думать о DateTime.Now.Ticks (например, 634970372342724417) и Guid.NewGuid(), но ни один из них не может быть объединен в электронное письмо с макс. 20 символов (или они могут?).

Я полагаю, что это не так сложно записать в файл номер, который содержит последний использованный номер, а затем использовать [email protected], [email protected], etc..., но если я могу избежать сохраняющегося состояния, я всегда делаю.

У кого-нибудь есть трюк или алгоритм, который дает что-то короткое "guid", которое уникально для достаточно длительного периода времени (скажем, года), который я мог бы использовать для своих адресов электронной почты с максимальной длиной 20 символов с ( max length guid) = 14 = 20 - длина "@x.com"?

4b9b3361

Ответ 1

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

Однако, если тики - это 64-разрядное число, и вы выписываете это число, вы получите более 20 символов.

Хитрость заключается в кодировании вашего 64-битного номера с использованием другой схемы. Предположим, что вы можете использовать 26 символов из западного алфавита + 10 цифр. Это делает 36 возможных символов. Если вы берете 5 бит, вы можете представить 32 символа. Этого должно быть достаточно. Возьмите 64-битные и разделите их на группы по 5 бит (64/5 - около 13 групп). Переводите каждые 5 бит на один символ. Таким образом, вы получите 13 символов, и вы можете добавить символ перед ним).

long ticks = DateTime.Now.Ticks;
byte[] bytes = BitConverter.GetBytes(ticks);
string id = Convert.ToBase64String(bytes)
                        .Replace('+', '_')
                        .Replace('/', '-')
                        .TrimEnd('=');
Console.WriteLine (id);

Урожайность:

Gq1rNzbezwg

Ответ 2

Поскольку вы указали не менее 1 секунды между каждым вызовом, это должно работать:

DateTime.Now.ToString("yyyyMMddHHmmss");

его ровно 14 символов.

Ответ 3

Если вы получаете следующие цифры от даты, вы должны иметь возможность заставить ее работать... Soemthing like:

DateTime.Now.ToString("yyMMddHHmmssff");

который составляет 16 символов, оставив 4 для другого префикса по мере необходимости.

Итак, 21 февраля 2013 года, примерно в 10:21 будет "130321102142", а следующий будет "130321102169" и т.д.

Посмотрите http://msdn.microsoft.com/en-us/library/zdtaw1bw.aspx для получения более подробной информации о форматировании даты и времени.

Ответ 4

Просто добавьте... Если вы хотите использовать номер только из тиков, вы можете использовать substring, например:

int onlyThisAmount = 20;
string ticks = DateTime.Now.Ticks.ToString();
ticks = ticks.Substring(ticks.Length - onlyThisAmount);

Ответ 5

    /// <summary>
    /// Get a unique reference number.
    /// </summary>
    /// <returns></returns>
    public string GetUniqueReferenceNumber(char firstChar)
    {
        var ticks = DateTime.Now.Ticks;
        var ticksString = ticks.ToString();
        var ticksSubString = ticksString.Substring((ticksString.Length - 15 > 0) ? ticksString.Length - 15 : 0); 
        if (this.currentTicks.Equals(ticks))
        {
            this.currentReference++;

            if (this.currentReference >= 9999)
            {
                // Only when there are very fast computers.
                System.Threading.Thread.Sleep(1);
            }

            return (firstChar + ticksSubString + this.currentReference.ToString("D4")).PadRight(20, '9');
        }

        this.currentReference = -1;
        this.currentTicks = ticks;
        return (firstChar + ticksSubString).PadRight(20, '9');
    }

В моем случае мне нужно было создать уникальный ссылочный номер с уникальным первым символом и максимум 20 символами. Возможно, вы можете использовать функцию ниже, она позволяет вам создать 9999 уникальных номеров за один тик. (включая ноль)

Конечно, вы можете создать свою собственную реализацию без первого символа и максимального количества символов 20