Re[4]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.11.10 11:52
Оценка: 7 (2)
Здравствуйте, zsergeyz, Вы писали:

Z>Мне не для URL нужно. И нужны именно 16-символьные последовательности. А GUID то не обрежешь. Уникальность нарушится.

Конечно-конечно. Я отвечал на конкретную фразу, не имеющую прямого отношения к топику.
Варианты:
1. GUID как раз влазит ровно в 16 8битных символов, если забить на читаемость.
2. Можно подсмотреть, как устроен сам GUID, и реализовать свою технологию для генерации более коротких последовательностей (естественно, ценой меньших гарантий уникальности).
Допустим, мы хотим утоптаться в base64. Тогда есть место для 6*16 = 96 бит. Не так уж и мало.
Если посмотреть в спецификацию GUID, то окажется, что там ничего сверхъестественного нет. Используемые сегодня GUID-ы, как правило, состоят из:
— 4х бит "версии", которые всегда одинаковые
— 1 бита "multicast", который гарантирует отстутсвие конфликтов GUID-ами, построенными на MAC-адресах
— 2 зарезервированных бит
— 14 бит "clock sequence", которые меняются относительно редко
— 60 бит таймстампа
— 47 бит "node", которые сгенерены псевдослучайным генератором

Итак, 7 бит в GUID итак никакой уникальности не добавляют. timestamp можно легко сократить: он показывает количество 100-наносекундных интервалов, прошедших с 15 октября 1582года. Можно безболезненно отрезать наиболее значимые биты. Грубо говоря, 50 бит хватит примерно на 10 лет уникальности.
Clock Sequence можно выбросить и вместо него при неудачных сдвигах времени перегенерировать node.
Таким образом:
1. 46 бит берёшь из криптоустойчивого генератора
2. 50 бит берёшь из timestamp.

Соотношение между 1 и 2 можно менять: если производительность неважна, то можно все 96 бит генерировать случайно. Если важна, то комбинируешь дешёвый timestamp и дорогой случайный генератор.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
б
Re[4]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.11.10 05:10
Оценка: 3 (1)
Здравствуйте, zsergeyz, Вы писали:
Z>Мне не для URL нужно. И нужны именно 16-символьные последовательности. А GUID то не обрежешь. Уникальность нарушится.
Не нужно относиться к GUID как к магии. Представьте, что функции CreateGuid не существует. Вы что, не сможете сами написать аналог? А теперь напишите аналог для 96 бит, а не для 128.
На всякий случай напомню, что GUID не гарантированно уникальны, а статистически уникальны.
На пальцах: это означает, что шансы на совпадение двух независимо сгенерированных GUID пренебрежимо малы, хотя и не равны нулю.
На тех же пальцах: оцените вероятность совпадения GUID в вашем случае. Оцените её же для совпадения для самодельных "GUID16". Формулы подсказать?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.11.10 05:33
Оценка: 3 (1)
Здравствуйте, zsergeyz, Вы писали:

Z>Нельзя. Нужно спрятать ID объекта. Чтобы следующий штрих-код не был "0000000000035135". Может какими-то битовыми сдвигами сделать. Нужно сделать так, чтобы штрихкод был похож на случайную последовательность. Хорошо бы подошел какой-нибудь алгоритм симметричного шифрования, для которого бы можно было задавать длину результата шифрования и символы, которые бы на выходе получались. (Если конечно такой алгоритм существует). Хэширование не подходит, т.к. оно не подразумевает уникальности генерируемых значений.

Используйте алгоритм RC4, применяемый при генерации GUID.
Вот здесь приведён подробный разбор — вместе с недостатками.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Как сгенерировать 16-значный UID объекта по его ключу
От: Ocelot  
Дата: 28.11.10 02:58
Оценка: +1
Здравствуйте, zsergeyz, Вы писали:

O>>Ну и так, на всякий случай — на уникальность не забывайте проверять. Даже по-настоящему случайные числа != неповторяющиеся.


Z>Так в том то и вопрос. Рандом сделать просто. Но не хотелось бы каждый раз базу проверять на уникальность вносимого значения.


А вы так или иначе от этого никак не избавитесь. Проверять уникальность перед записью в таблицу (и, если необходимо, перегенерировать клод) или сразу пытаться записывать (и получать ошибку неуникального значения ключа) — это ваше дело. Важно то, что по теории вероятностей любой генератор — случайный или псевдослучайный (хоть монетку подбрасывайте) — может с ненулевой вероятностью вернуть один и тот же код повторно.
Вряд ли это должно быть проблемой, проверка по ключу в базе очень быстрая, даже если код в виде строки хранить.
Re[3]: Как сгенерировать 16-значный UID объекта по его ключу
От: Pavel_Agurov Россия  
Дата: 13.12.10 07:10
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Pavel_Agurov, Вы писали:

P_A>>А насколько этот шифр должен быть стойким? Можно например взять эти 8 цифирок, расставить их на четные места. А на нечетные расставить что-то совершенно случайное. Полученную кашу из 16 символов и считать UID. Посложнее — на четные места расставить ID xor 55 по каждому байту. Учитывая что нечетные места никогда не будут повторяться, то UID бутут разные. А что вписывать в четные места — придумайте сами. Можно timespamp какой-нибудь или еще какую-то информацию.
S>Я так понял, что не хочется иметь возможность предсказывать следующий ID. Предлагаемый способ даст злоумышленнику шанс увидеть закономерность по нескольким UID.

Закономерность можно будет увидеть только в половине цифирок. В остальных 8 закономерности не будет, если стандартный Random не использовать. Собственно и вопрос-то в том — насколько это все должно быть стойким...
Как сгенерировать 16-значный UID объекта по его ключу в DB
От: zsergeyz  
Дата: 26.11.10 13:46
Оценка:
Задача следующая:
— Для объекта необходимо задавать уникальный 16-символьный UID (используя цифры от 0 до 9)
— ID объектов в базе данных сейчас имеют значения от 1 до чисел 5-го порядка (1 ... 100001, 100002 и т.д.). Дойдут максимум до 8 порядка.
— Алгоритм генерации UID может быть абсолютно любой. Главное, чтобы UID никогда не повторялись.

В данный момент есть задумка:
1) преобразовать DB ID объекта в строку
2) добить ее нулями до 16 символов (как пример "0000000000035134")
3) зашифровать строку, используя алгоритм шифрации, который даст на выходе такое же количество символов. Притом строка также будет состоять из десятичных цифр.
Пока такой алгоритм шифрования не найден.
Пожалуйста, подскажите куда двигаться. Может есть идеи получше моей? Заранее спасибо.
шифрация шифрование ключ серийный номер id генерация алгоритм
Re: Как сгенерировать 16-значный UID объекта по его ключу в
От: Sinix  
Дата: 26.11.10 13:54
Оценка:
Здравствуйте, zsergeyz, Вы писали:

Z>Задача следующая:

Z> — Для объекта необходимо задавать уникальный 16-символьный UID (используя цифры от 0 до 9)
Z> — ID объектов в базе данных сейчас имеют значения от 1 до чисел 5-го порядка (1 ... 100001, 100002 и т.д.). Дойдут максимум до 8 порядка.
Z> — Алгоритм генерации UID может быть абсолютно любой. Главное, чтобы UID никогда не повторялись.

1. Автоинкремент на сервере с возвращением значения клиенту.
2. Guid (со страховкой на случай случайных дубликатов).

Всё остальное — изврат.
Re[2]: Как сгенерировать 16-значный UID объекта по его ключу
От: zsergeyz  
Дата: 26.11.10 14:12
Оценка:
Здравствуйте, Sinix, Вы писали:

S>1. Автоинкремент на сервере с возвращением значения клиенту.

S>2. Guid (со страховкой на случай случайных дубликатов).

S>Всё остальное — изврат.


1. UID должен иметь фиксированный размер 16 символов, кроме того UID визуально не должны идти последовательно и легко подбираться
2. GUID имеет больше 16 цифр в десятичном выражении и не подходит.
Re[3]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinix  
Дата: 26.11.10 14:26
Оценка:
Здравствуйте, zsergeyz, Вы писали:

Z>1. UID должен иметь фиксированный размер 16 символов, кроме того UID визуально не должны идти последовательно и легко подбираться

Z>2. GUID имеет больше 16 цифр в десятичном выражении и не подходит.
У вас что, ещё и строковые идентификаторы??? Зачем?
Re[3]: Как сгенерировать 16-значный UID объекта по его ключу
От: QrystaL Украина  
Дата: 26.11.10 14:28
Оценка:
Z>1. UID должен иметь фиксированный размер 16 символов, кроме того UID визуально не должны идти последовательно и легко подбираться
Z>2. GUID имеет больше 16 цифр в десятичном выражении и не подходит.

Можно посмотреть в сторону ObjectIDGenerator.
Re[4]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinix  
Дата: 26.11.10 14:42
Оценка:
Здравствуйте, QrystaL, Вы писали:

Z>>1. UID должен иметь фиксированный размер 16 символов, кроме того UID визуально не должны идти последовательно и легко подбираться

Z>>2. GUID имеет больше 16 цифр в десятичном выражении и не подходит.

QL>Можно посмотреть в сторону ObjectIDGenerator.

Не, тогда уж что-то из криптогенераторов, там хоть иллюзия рандомности есть.
Re[4]: Как сгенерировать 16-значный UID объекта по его ключу
От: zsergeyz  
Дата: 26.11.10 14:58
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, zsergeyz, Вы писали:


Z>>1. UID должен иметь фиксированный размер 16 символов, кроме того UID визуально не должны идти последовательно и легко подбираться

Z>>2. GUID имеет больше 16 цифр в десятичном выражении и не подходит.
S>У вас что, ещё и строковые идентификаторы??? Зачем?

Может можно и без строк. Если предложете вариант — будет здорово.
Re[4]: Как сгенерировать 16-значный UID объекта по его ключу
От: zsergeyz  
Дата: 26.11.10 14:59
Оценка:
Здравствуйте, QrystaL, Вы писали:

Z>>1. UID должен иметь фиксированный размер 16 символов, кроме того UID визуально не должны идти последовательно и легко подбираться

Z>>2. GUID имеет больше 16 цифр в десятичном выражении и не подходит.

QL>Можно посмотреть в сторону ObjectIDGenerator.


Посмотрел ObjectIdGenerator. Вроде не то что-то.
Re[5]: Как сгенерировать 16-значный UID объекта по его ключу
От: Clickmaker Россия http://relaxander.webest.net/
Дата: 26.11.10 15:00
Оценка:
Z>Может можно и без строк. Если предложете вариант — будет здорово.

фиксированный размер 16 символов без строк?
Re[5]: Как сгенерировать 16-значный UID объекта по его ключу
От: QrystaL Украина  
Дата: 26.11.10 15:05
Оценка:
Z>Посмотрел ObjectIdGenerator. Вроде не то что-то.
Ну оно естественно для другого предназначено, я в качестве brainstorm-а его привел.
Re[5]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinix  
Дата: 26.11.10 15:30
Оценка:
Здравствуйте, zsergeyz, Вы писали:

Z>Может можно и без строк. Если предложете вариант — будет здорово.

Если вы объясните: зачем вам _ровно_ 16 символов, да ещё и в роли уникального идентификатора — всем будет куда как легче

Например
    private const long MaxNum = (long)1E16 - 1;
    static readonly string toStringFormat = new string('0', 16);

    private static void Main(string[] args)
    {
      for (int i = 0; i < 10; i++)
      {
        Console.WriteLine(GetRandom(0,MaxNum).ToString(toStringFormat));
      }
      Console.Write("Done...");
      Console.ReadKey();
    }

    private static long GetRandom(long minVal, long maxVal)
    {
      RandomNumberGenerator rnd = RNGCryptoServiceProvider.Create();
      byte[] buffer = BitConverter.GetBytes(0L);
      rnd.GetBytes(buffer);

      return Math.Abs(BitConverter.ToInt64(buffer, 0) % (maxVal - minVal)) + minVal;
    }

Только это нифига не надёжно в плане равномерности заполнения.
Re[6]: Как сгенерировать 16-значный UID объекта по его ключу
От: zsergeyz  
Дата: 26.11.10 16:28
Оценка:
Здравствуйте, Clickmaker, Вы писали:

Z>>Может можно и без строк. Если предложете вариант — будет здорово.


C>фиксированный размер 16 символов без строк?


Да. Не представляю правда как это будет выглядеть
Можно в виде чисел, размерностью 16 либо 15 (добью нулем)
Re: Как сгенерировать 16-значный UID объекта по его ключу в
От: sunshine Россия https://angel.ru/?src=rsdn
Дата: 26.11.10 17:59
Оценка:
Тут народ удивлялся -- зачем это нужно. Не знаю, зачем это нужно ТС, но на днях как раз думал над тем, как на сайте знакомств обеспечить невидимость URL некоторых анкет и фоток, без затрат на проверку прав каждый раз.
Дело в том, что адреса анкет и фоток хотелось бы иметь статические, в RESTful стиле, но это дает возможность всем желающим перебирать айдишники в URL, и увидеть анкеты и фотки, закрытые их владельцем для общего доступа. Ну и тоже, напрашивается решение сделать айдишники не простыми последовательными числами, а буквенно-цифровыми сочетаниями, да подлиннее. Но гуиды для этого черезчур уж велики, URL будут выглядеть слишком громоздко (да и наверно индекс в БД будет не так эффективен), поэтому и встает вопрос о том, как проще генерировать такие сочетания символов — более-менее случайные последовательности. Ну и как-то интуитивно кажется, что фиксированная длина последовательности более предпочтительна.
Правда, в отличие от ТС, тут вроде бы не стоит задача делать эти последовательности именно на основе чисел — айдишников объектов.
Принимаю платежи в любой валюте
Re[2]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.11.10 18:13
Оценка:
Здравствуйте, sunshine, Вы писали:

S>Тут народ удивлялся -- зачем это нужно. Не знаю, зачем это нужно ТС, но на днях как раз думал над тем, как на сайте знакомств обеспечить невидимость URL некоторых анкет и фоток, без затрат на проверку прав каждый раз.

S>Дело в том, что адреса анкет и фоток хотелось бы иметь статические, в RESTful стиле, но это дает возможность всем желающим перебирать айдишники в URL, и увидеть анкеты и фотки, закрытые их владельцем для общего доступа. Ну и тоже, напрашивается решение сделать айдишники не простыми последовательными числами, а буквенно-цифровыми сочетаниями, да подлиннее. Но гуиды для этого черезчур уж велики, URL будут выглядеть слишком громоздко
Ничего громоздкого. GUID — это всего лишь 22 символа в Base64. Для урлов — самое то, тем более, что никто не собирается набирать их руками.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как сгенерировать 16-значный UID объекта по его ключу
От: zsergeyz  
Дата: 26.11.10 18:28
Оценка:
Здравствуйте, sunshine, Вы писали:

S>Тут народ удивлялся -- зачем это нужно. Не знаю, зачем это нужно ТС, но на днях как раз думал над тем, как на сайте знакомств обеспечить невидимость URL некоторых анкет и фоток, без затрат на проверку прав каждый раз.

S>Дело в том, что адреса анкет и фоток хотелось бы иметь статические, в RESTful стиле, но это дает возможность всем желающим перебирать айдишники в URL, и увидеть анкеты и фотки, закрытые их владельцем для общего доступа. Ну и тоже, напрашивается решение сделать айдишники не простыми последовательными числами, а буквенно-цифровыми сочетаниями, да подлиннее. Но гуиды для этого черезчур уж велики, URL будут выглядеть слишком громоздко (да и наверно индекс в БД будет не так эффективен), поэтому и встает вопрос о том, как проще генерировать такие сочетания символов — более-менее случайные последовательности. Ну и как-то интуитивно кажется, что фиксированная длина последовательности более предпочтительна.
S>Правда, в отличие от ТС, тут вроде бы не стоит задача делать эти последовательности именно на основе чисел — айдишников объектов.

Еще раз кратко по задаче. Нужно генерировать именно 16-значные коды. Они потом будут использоваться в генерации штрих-кодов определенного формата. Притом в результирующей строке должны быть только символы цифр. И наверное самый простой вариант — это генерировать эти последовательности на основе айдишников объектов из базы данных.
Re[3]: Как сгенерировать 16-значный UID объекта по его ключу
От: zsergeyz  
Дата: 26.11.10 18:29
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, sunshine, Вы писали:


S>>Тут народ удивлялся -- зачем это нужно. Не знаю, зачем это нужно ТС, но на днях как раз думал над тем, как на сайте знакомств обеспечить невидимость URL некоторых анкет и фоток, без затрат на проверку прав каждый раз.

S>>Дело в том, что адреса анкет и фоток хотелось бы иметь статические, в RESTful стиле, но это дает возможность всем желающим перебирать айдишники в URL, и увидеть анкеты и фотки, закрытые их владельцем для общего доступа. Ну и тоже, напрашивается решение сделать айдишники не простыми последовательными числами, а буквенно-цифровыми сочетаниями, да подлиннее. Но гуиды для этого черезчур уж велики, URL будут выглядеть слишком громоздко
S>Ничего громоздкого. GUID — это всего лишь 22 символа в Base64. Для урлов — самое то, тем более, что никто не собирается набирать их руками.

Мне не для URL нужно. И нужны именно 16-символьные последовательности. А GUID то не обрежешь. Уникальность нарушится.
Re[3]: Как сгенерировать 16-значный UID объекта по его ключу
От: Ocelot  
Дата: 26.11.10 22:48
Оценка:
Здравствуйте, zsergeyz, Вы писали:

Z>Еще раз кратко по задаче. Нужно генерировать именно 16-значные коды. Они потом будут использоваться в генерации штрих-кодов определенного формата. Притом в результирующей строке должны быть только символы цифр. И наверное самый простой вариант — это генерировать эти последовательности на основе айдишников объектов из базы данных.


А чем это проще? По-моему, как раз абсолютно все равно, будете вы их использовать при генерации, или нет.
Если я правильно понимаю, вам нужно: а) для каждого ID сгенерировать свой код (причем и ID, и коды должны быть уникальными) б) код должен быть псевдо-случайным.

С первым пунктом проблем никаких, отдельная колонка (фактически еще один ключ) или отдельная таблица 1:1, это уж как хотите.
Ну а со вторым — все тоже не сложно. Самый простой способ — используя стандартный класс Random:

public class CodeGenerator {

    private const int EIGHT_DIGIT_UPPER_BOUND = 100000000;

    private Random random = new Random();

    public decimal Next() {
        decimal upper = random.Next(EIGHT_DIGIT_UPPER_BOUND);
        decimal lower = random.Next(EIGHT_DIGIT_UPPER_BOUND);
        return upper * EIGHT_DIGIT_UPPER_BOUND + lower;
    }
}


Если надо именно строку, просто ToString() с нужным форматом.
Хотя если в базе как ключ собираетесь использовать, то DECIMAL имхо будет лучше.

Скорее всего, в вашем случае что-нибудь типа этого вполне будет достаточно.
Если по каким-то причинам нет — или использовать что-нибудь посерьезнее из готового ( System.Security.Cryptography.RandomNumberGenerator), или самому реализовать какой-нибудь алгоритм, благо их масса(http://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB).

Ну и так, на всякий случай — на уникальность не забывайте проверять. Даже по-настоящему случайные числа != неповторяющиеся.
Re: Как сгенерировать 16-значный UID объекта по его ключу в
От: MozgC США http://nightcoder.livejournal.com
Дата: 26.11.10 23:00
Оценка:
Здравствуйте, zsergeyz, Вы писали:

Z>В данный момент есть задумка:

Z>1) преобразовать DB ID объекта в строку
Z>2) добить ее нулями до 16 символов (как пример "0000000000035134")

Всё. Дальше по этой строке "0000000000035134" рисуете штрих-код.
Re[4]: Как сгенерировать 16-значный UID объекта по его ключу
От: zsergeyz  
Дата: 27.11.10 10:34
Оценка:
Здравствуйте, Ocelot, Вы писали:

O>Ну и так, на всякий случай — на уникальность не забывайте проверять. Даже по-настоящему случайные числа != неповторяющиеся.


Так в том то и вопрос. Рандом сделать просто. Но не хотелось бы каждый раз базу проверять на уникальность вносимого значения. Чем больше будет становиться база, тем больше вероятность совпадения ID. Этого не хотелось бы. Я хотел бы найти алгоритм генерации 16-значного ключа по ID объекта. Т.е. закодировать ID и получить на выходе 16-символьную строку с соблюдением уникальности.
Требование заказчика — иметь в итоге уникальный 16-значный ключ (не больше и не меньше), состоящий из символов 0..9.
Re[2]: Как сгенерировать 16-значный UID объекта по его ключу
От: zsergeyz  
Дата: 27.11.10 10:38
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Здравствуйте, zsergeyz, Вы писали:


Z>>В данный момент есть задумка:

Z>>1) преобразовать DB ID объекта в строку
Z>>2) добить ее нулями до 16 символов (как пример "0000000000035134")

MC>Всё. Дальше по этой строке "0000000000035134" рисуете штрих-код.


Нельзя. Нужно спрятать ID объекта. Чтобы следующий штрих-код не был "0000000000035135". Может какими-то битовыми сдвигами сделать. Нужно сделать так, чтобы штрихкод был похож на случайную последовательность. Хорошо бы подошел какой-нибудь алгоритм симметричного шифрования, для которого бы можно было задавать длину результата шифрования и символы, которые бы на выходе получались. (Если конечно такой алгоритм существует). Хэширование не подходит, т.к. оно не подразумевает уникальности генерируемых значений.
Re[5]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinix  
Дата: 27.11.10 10:59
Оценка:
Здравствуйте, zsergeyz, Вы писали:


Z>Так в том то и вопрос. Рандом сделать просто. Но не хотелось бы каждый раз базу проверять на уникальность вносимого значения.

1. У вас в любом случае должен быть UQ на столбец со штрих-кодами. Вы уже потратили больше времени (и своего, и отвечавших), чем сэкономите при самом лучшем раскладе.
2. Бизнес-данные (а штрих-код — это уже часть системы) должны быть независимы от деталей реализации. Потребуется вам сменить id на GUID (например, для реплик во внешнюю систему) — что будете делать?
3. Вы хотите симметричное шифрование, соответственно, всё, что вас спасает от возможности реверса — это симметричный ключ в те же 53 бита. И надежда, что сам ID не засветится нигде снаружи, в т.ч. и в памяти клиента. Если вы хотите на этом строить безопасность — вперёд. Если не хотите — какая разница, подберут вам следующий ID или нет?
4. Правильный рэндом (со статистически равномерным заполнением 53х бит) сделать тоже не так-то и легко
Re: Как сгенерировать 16-значный UID объекта по его ключу в
От: TK Лес кывт.рф
Дата: 27.11.10 12:33
Оценка:
Здравствуйте, zsergeyz, Вы писали:

Z> — Алгоритм генерации UID может быть абсолютно любой. Главное, чтобы UID никогда не повторялись.


Если вам не важно, что по UID можно будет относительно просто восстановить оригинальный ID то, можно сделать XOR оригинального ID со случайной (или псевдо-случайной) маской.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: Как сгенерировать 16-значный UID объекта по его ключу
От: zsergeyz  
Дата: 11.12.10 12:18
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Формулы подсказать?


Было бы здорово!
Re: Как сгенерировать 16-значный UID объекта по его ключу в
От: Pavel_Agurov Россия  
Дата: 11.12.10 14:58
Оценка:
Z>Задача следующая:
Z> — Для объекта необходимо задавать уникальный 16-символьный UID (используя цифры от 0 до 9)
Z> — ID объектов в базе данных сейчас имеют значения от 1 до чисел 5-го порядка (1 ... 100001, 100002 и т.д.). Дойдут максимум до 8 порядка.
Z> — Алгоритм генерации UID может быть абсолютно любой. Главное, чтобы UID никогда не повторялись.

Z>В данный момент есть задумка:

Z>1) преобразовать DB ID объекта в строку
Z>2) добить ее нулями до 16 символов (как пример "0000000000035134")
Z>3) зашифровать строку, используя алгоритм шифрации, который даст на выходе такое же количество символов. Притом строка также будет состоять из десятичных цифр.

А насколько этот шифр должен быть стойким? Можно например взять эти 8 цифирок, расставить их на четные места. А на нечетные расставить что-то совершенно случайное. Полученную кашу из 16 символов и считать UID. Посложнее — на четные места расставить ID xor 55 по каждому байту. Учитывая что нечетные места никогда не будут повторяться, то UID бутут разные. А что вписывать в четные места — придумайте сами. Можно timespamp какой-нибудь или еще какую-то информацию.
Re[6]: Как сгенерировать 16-значный UID объекта по его ключу
От: hardcase Пират http://nemerle.org
Дата: 11.12.10 19:11
Оценка:
Здравствуйте, zsergeyz, Вы писали:

Z>Здравствуйте, Sinclair, Вы писали:


S>>Формулы подсказать?


Z>Было бы здорово!


Мне думаюется вам нужен некий сдвиговый регистр (в сущности RC4 его и использует)?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[7]: Как сгенерировать 16-значный UID объекта по его ключу
От: hardcase Пират http://nemerle.org
Дата: 11.12.10 19:12
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Мне думаюется вам нужен некий сдвиговый регистр (в сущности RC4 его и использует)?


Упс. Не туда ссылку дал. Вот правильная.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.12.10 06:13
Оценка:
Здравствуйте, zsergeyz, Вы писали:
Z>Было бы здорово!
http://en.wikipedia.org/wiki/Birthday_problem
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как сгенерировать 16-значный UID объекта по его ключу
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.12.10 06:47
Оценка:
Здравствуйте, Pavel_Agurov, Вы писали:
P_A>А насколько этот шифр должен быть стойким? Можно например взять эти 8 цифирок, расставить их на четные места. А на нечетные расставить что-то совершенно случайное. Полученную кашу из 16 символов и считать UID. Посложнее — на четные места расставить ID xor 55 по каждому байту. Учитывая что нечетные места никогда не будут повторяться, то UID бутут разные. А что вписывать в четные места — придумайте сами. Можно timespamp какой-нибудь или еще какую-то информацию.
Я так понял, что не хочется иметь возможность предсказывать следующий ID. Предлагаемый способ даст злоумышленнику шанс увидеть закономерность по нескольким UID.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.