Новые форумы для: пользователей, администраторов, математиков и филологов.
0

Мне надо найти алгоритм генерации никогда не повторяющейся последовательности. В последовательность могут входить цифры и буквы (нельзя включать нечитаемые символы). Нужно примерно то же, что и в генерации GUID в для COM-объектов. Если кто знает популярные алгоритмы/библиотеки, прошу поделиться советом.

задан 22 Фев 16:05

bumer's gravatar image

bumer
3396
51% принятых

изменен 24 Фев 14:38

Expert's gravatar image

Expert
5.3k12043

1

А сам UUID почему не подходит?

(22 Фев 16:08) VioLet

Совет в лоб: md5 от текущей даты + MAC сетевой карты (или SN другого железа).

(22 Фев 16:09) fogbit

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

как вам уже предлагали md5 от даты + 1 бит/байт как вам удобнее

(22 Фев 20:35) jmu
1

Как верно подметил @VioLet, можно использовать UUID. Не доконца разобрался, будит ли он уникальным всегда или нет, но нашел реализацию v4 на Go. Код:

func NewUUID() []byte {
    uuid := make([]byte, 16)

    _, err := io.ReadFull(rand.Reader, uuid)

    if err != nil {
            log.Fatal(err)
    }

    var version byte = 4 << 4
    var variant byte = 2 << 4

    uuid[6] = version | (uuid[6] & 15)
    uuid[8] = variant | (uuid[8] & 15)

    return uuid

}

ссылка

отвечен 22 Фев 17:02

bumer's gravatar image

bumer
3396

Учитывая кол-во ключей = 3.4 × 10^38, можно считать каждый новый ключ уникальным. Ну или, дабы прям совсем исключить возможность повторения, можно, как сказал @fogbit, добавлять к нему еще и timestamp (или строку текущего времени).

(22 Фев 17:07) VioLet
1

Весь вопрос упирается в степень достоверности уникальности кода. Если это не сильно принципиально (ну скажем устраивает вероятность появления повторяющегося кода порядка 10 в минус 6-7) - то вполне нормально тупо брать текущее время + случайный символ и хэш ключ от этого значения. В псевдокоде я бы написал так:

return hash(System.currentTimeMillis() & random());

Если требуется железобетонная уверенность то нужен генератор спецом. В Java для этого существует удобный пакет java.util.concurrent.atomic

ссылка

отвечен 24 Фев 10:23

Barmaley's gravatar image

Barmaley
6.1k111

Ваш ответ

Если вы не нашли ответ, задайте вопрос.

Здравствуйте

ХэшКод - это совместно редактируемый форум вопросов и ответов для начинающих и опытных программистов.

Присоединяйтесь!

отмечен:

×1,529
×1,473
×317
×140
×11

задан
22 Фев 16:05

показан
159 раз

обновлен
24 Фев 14:38

Отслеживать вопрос

по почте:

Зарегистрировавшись, вы сможете подписаться на любые обновления

по RSS:

Ответы

Ответы и Комментарии