Создать уникальный идентификатор последовательности - PullRequest
2 голосов
/ 16 июня 2011

Как сгенерировать уникальный идентификатор последовательности для хранения в беззнаковых длинных? Было бы неплохо получить секунды, прошедшие после 1970 года, но требование - в течение секунды идентификатор может быть обновлен, поэтому секунда не будет уникальной!

Ответы [ 5 ]

7 голосов
/ 16 июня 2011

Если вы не предоставите больше информации о ваших требованиях, будет сложно найти ответ, кроме:

unsigned long next_id = 0;

unsigned long new_id() {
    return next_id++;
}
1 голос
/ 16 июня 2011

Если вы хотите выбрать что-то псевдослучайное, быстрое, надежно уникальное и не используемое для требований криптографической безопасности, я предлагаю следующее

В Windows X86:

__rdtsc () - примерно столько же, сколько и порядковый номер.XOR старшие 32 бита возвращаемого значения с младшими 32 битами.Поскольку младшие 32 бита будут циклически повторяться каждые пару секунд

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <intrin.h>
#include <stdint.h>

uint32_t GetPseudoRandomNumber()
{
    uint64_t t = _time64(NULL);
    uint64_t cpu = __rdtsc();
    uint32_t result;
    cpu = cpu ^ t;
    result = (cpu >> 32) ^ (cpu & 0xffffffff);
    return result;
}

uint32_t GetPseudoRandomNumber2()
{
    GUID guid = {};
    uint32_t* pValue = (uint32_t*)&guid;
    uint32_t result;

    CoCreateGuid(&guid);

    result = pValue[0] ^ pValue[1] ^ pValue[2] ^ pValue[3];

    return result;
}

Другие источники энтропии включают GetTickCount () (уникален с точностью до миллисекунды)

В Linux: просто прочитайте 4 байта из / DEV / urandom

0 голосов
/ 05 августа 2011

Как вы генерируете unique_ids - полезный вопрос, но вы, кажется, делаете контрпродуктивное предположение о , когда вы генерируете их!

Моя точка зрения в том, что вам не нужносгенерируйте эти уникальные идентификаторы во время создания ваших строк, потому что они по существу не зависят от вставляемых данных.

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

Например, у меня есть таблица заказов с order_id.Этот идентификатор генерируется на лету, когда пользователь вводит заказ, постепенно 1,2,3 и т. Д. Навсегда.Пользователю не нужно видеть этот внутренний идентификатор.

Тогда у меня есть другая таблица - unique_ids с (order_id, unique_id).У меня есть подпрограмма, которая запускается каждую ночь, которая предварительно загружает эту таблицу с достаточным количеством строк unique_id, чтобы более чем покрывать заказы, которые могут быть вставлены в следующие 24 часа.(Если я когда-нибудь получу 10000 заказов за один день, у меня возникнет проблема - но это было бы хорошей проблемой!)

Этот подход гарантирует уникальность и устраняет любую нагрузку обработки от транзакции вставки допакетная процедура, где она не влияет на пользователя.

0 голосов
/ 16 июня 2011

Попробуйте использовать: srand ( time(NULL) );

0 голосов
/ 16 июня 2011

использовать миллисекунды, прошедшие после 1970

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...