Как сгенерировать 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". Может какими-то битовыми сдвигами сделать. Нужно сделать так, чтобы штрихкод был похож на случайную последовательность. Хорошо бы подошел какой-нибудь алгоритм симметричного шифрования, для которого бы можно было задавать длину результата шифрования и символы, которые бы на выходе получались. (Если конечно такой алгоритм существует). Хэширование не подходит, т.к. оно не подразумевает уникальности генерируемых значений.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.