Как создать уникальный ID? (в double)
От: Sirotkin Alexander  
Дата: 07.12.01 12:05
Оценка:
Привет АЛЛ!!

Ситуация вот в чем. На разных машинах создаются объекты. Которые сохраняются в базе.
Между этими базами возможен экспорт и импорт. Эти объекты надо как-то идентифицировать.
Названия могут быть любыми.

Так уж получилось что под код есть поле double. (уже используется, тот способ генерации ключа что был раньше не подходит)
Отсюда вопрос, как сгенерить этот код что бы он был достаточно уникальным и помещался в double?

У меня был такой ход мысли:
Выделить для каждой машины диапазон, но это не представляется возможным.

Количество создаваемых объектов не столь уж велико. Но могут быть случаи когда за раз их будут генерить сотнями.
Зато потом по обекту раз в день.
Поэтому первая идея привязаться ко времени. Но надо еще как то учитывать что в одно и то же время объекты могут сгенериться на разных машинах, или много объектов на одной. Т.е. время плюс еще что то.

Не подскажит ли мне всезнающий алл вот это самое еще что то?
Может кто — нибудь еще что то предложит?

С уважением Александр.
Re: Как создать уникальный ID? (в double)
От: retalik www.airbandits.com/
Дата: 07.12.01 12:47
Оценка:
Здравствуйте Sirotkin Alexander, Вы писали:

SA>Привет АЛЛ!!


SA>Ситуация вот в чем. На разных машинах создаются объекты. Которые сохраняются в базе.

SA>Между этими базами возможен экспорт и импорт. Эти объекты надо как-то идентифицировать.
SA>Названия могут быть любыми.

SA>Так уж получилось что под код есть поле double. (уже используется, тот способ генерации ключа что был раньше не подходит)

SA>Отсюда вопрос, как сгенерить этот код что бы он был достаточно уникальным и помещался в double?

SA>У меня был такой ход мысли:

SA>Выделить для каждой машины диапазон, но это не представляется возможным.

SA>Количество создаваемых объектов не столь уж велико. Но могут быть случаи когда за раз их будут генерить сотнями.

SA>Зато потом по обекту раз в день.
SA>Поэтому первая идея привязаться ко времени. Но надо еще как то учитывать что в одно и то же время объекты могут сгенериться на разных машинах, или много объектов на одной. Т.е. время плюс еще что то.

SA>Не подскажит ли мне всезнающий алл вот это самое еще что то?

SA>Может кто — нибудь еще что то предложит?

А централизованную раздачу ID с одного сервера нельзя организовать? Это было бы наилучшим решением, если есть постоянное соединение.
И потом, уж очень странный выбор формата ID... трудно что-то посоветовать... А, кстати, почему нельзя ввести диапазоны значений ID?

Если машин не очень много, а объектов гораздо больше (кстати, сколько?), можно назначить каждой машине множитель (заведомо больший максимального числа объектов на этой машине) и порядковый номер очередного объекта (его хранить глобально) умножать на этот множитель.
Успехов,
Виталий.
Re[2]: Как создать уникальный ID? (в double)
От: Sirotkin Alexander  
Дата: 07.12.01 13:03
Оценка:
Здравствуйте retalik, Вы писали:


R>А централизованную раздачу ID с одного сервера нельзя организовать? Это было бы наилучшим решением, если есть постоянное соединение.

К сожалению соединения с сервером может не быть вобще.
R>И потом, уж очень странный выбор формата ID... трудно что-то посоветовать... А, кстати, почему нельзя ввести диапазоны значений ID?

R>Если машин не очень много, а объектов гораздо больше (кстати, сколько?), можно назначить каждой машине множитель (заведомо больший максимального числа объектов на этой машине) и порядковый номер очередного объекта (его хранить глобально) умножать на этот множитель.


Машин будет достаточно много, точнее не известно сколко, больше нескольких сотен и большая чатсть из них не будет связана между собой.
И потом продукт идет в виде одной инсталяции, и строить инсталяшку для каждого пользователя не реально.

Я больше думал о варианте время + хороший ГСЧ. Если кто подскажет хороший алгоритм ГСЧ, буду очень благодарен. (2 тома Кнута, где говорят есть нечколько алгоритмов к сожалению нету).

С уважением Александр.
Re[3]: Как создать уникальный ID? (в double)
От: OlegO Россия http://www.mediachase.ru
Дата: 07.12.01 13:10
Оценка:
Здравствуйте Sirotkin Alexander, Вы писали:

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



R>>А централизованную раздачу ID с одного сервера нельзя организовать? Это было бы наилучшим решением, если есть постоянное соединение.

SA>К сожалению соединения с сервером может не быть вобще.
R>>И потом, уж очень странный выбор формата ID... трудно что-то посоветовать... А, кстати, почему нельзя ввести диапазоны значений ID?

R>>Если машин не очень много, а объектов гораздо больше (кстати, сколько?), можно назначить каждой машине множитель (заведомо больший максимального числа объектов на этой машине) и порядковый номер очередного объекта (его хранить глобально) умножать на этот множитель.


SA>Машин будет достаточно много, точнее не известно сколко, больше нескольких сотен и большая чатсть из них не будет связана между собой.

SA>И потом продукт идет в виде одной инсталяции, и строить инсталяшку для каждого пользователя не реально.

SA>Я больше думал о варианте время + хороший ГСЧ. Если кто подскажет хороший алгоритм ГСЧ, буду очень благодарен. (2 тома Кнута, где говорят есть нечколько алгоритмов к сожалению нету).


SA>С уважением Александр.


Используй GUID в строковом представлении, думаю с переходом с DOUBLE на BSTR проблем
не должно возникнуть.

Тем более, что так ты сможешь избежать головной боли с уникальностью на 100%, я надеюсь.
С уважением, OlegO.
Re[2]: Как создать уникальный ID? (в double)
От: VVV Россия  
Дата: 07.12.01 13:18
Оценка:
Здравствуйте retalik, Вы писали:

R>Здравствуйте Sirotkin Alexander, Вы писали:


SA>>Привет АЛЛ!!


SA>>Отсюда вопрос, как сгенерить этот код что бы он был достаточно уникальным и помещался в double?



SA>>Не подскажит ли мне всезнающий алл вот это самое еще что то?



R>Если машин не очень много, а объектов гораздо больше (кстати, сколько?), можно назначить каждой машине множитель (заведомо больший максимального числа объектов на этой машине) и порядковый номер очередного объекта (его хранить глобально) умножать на этот множитель.


ещё идея: использовать в качестве "что то" какое-нибудь уникальное свойство машины:
1. ip-адрес — он 4 байта, поэтому для ключей остаётся ещё очень большое пространство — недостаток: ip-адреса надо жёстко задать для каждой машины.
2. 3-6 (или больше) первых(последних) символов имени каждой машины
3. хэш значение имени машины (тут надо быть осторожным, чтобы не совпали)
...
Re: Как создать уникальный ID? (в double)
От: Brother Россия  
Дата: 07.12.01 17:45
Оценка:
Здравствуйте Sirotkin Alexander, Вы писали:
SA>Привет АЛЛ!!
SA>Ситуация вот в чем. На разных машинах создаются объекты. Которые сохраняются в базе.
SA>Между этими базами возможен экспорт и импорт. Эти объекты надо как-то идентифицировать.
SA>Названия могут быть любыми.
К чему городить огород, когда есть хороший алгоритм генерации GUID (посмотрите в сети, там и с исходниками, и с комментариями...)
Если хочется чего-то доморощенного — вот вам пожалуйста MAC-адрес сетевой карты (он аппаратно уникален, ибо существует некий сговор производителей на этот счет ) плюс текущее время в миллисекундах. (GUID, кажется, как-то так и изготавливается)
Если кажется, что за миллисекунду можно сгенерить более одного объекта — не стесняйся, сделай эту задержку гарантированной. Сто-двести миллисекунд в день (0.2 секунды) никто не заметит, уверяю тебя!
Все это хозяйство надо привести к искомым восьми байтам. Для этого подойдет какой-либо алгоритм генерации "дайджеста" сообщения (вот к примеру MD5, тоже в сети полным-полно; он, правда, дает вовсе не восемь байт, а больше, но можно как минимум идею почерпнуть).
Желаю успехов!
С уважением,
Сергей
Re[2]: Как создать уникальный ID? (в double)
От: Sirotkin Alexander  
Дата: 08.12.01 09:21
Оценка:
Здравствуйте Brother, Вы писали:

B>К чему городить огород, когда есть хороший алгоритм генерации GUID (посмотрите в сети, там и с исходниками, и с комментариями...)

Да конечно. Но! он 128бит, т.е. 16 байт.
Причем при отсутствии сетевой карточки он уникален в пределах машины. И посмотри на GUIDы сгенеренные на 98...
Но конечно основная проблема размер.

B>Если хочется чего-то доморощенного — вот вам пожалуйста MAC-адрес сетевой карты (он аппаратно уникален, ибо Абсолютно верно. В Guid сгенеренных на всем кроме 2000, МАС адрес практически виден. Но что делать если нет сетевой карты?


B>Если кажется, что за миллисекунду можно сгенерить более одного объекта — не стесняйся, сделай эту задержку >гарантированной. Сто-двести миллисекунд в день (0.2 секунды) никто не заметит, уверяю тебя!


Это здравая мысль, она мне приходила в голову, и я ее наверняка буду использовать. (Хотя вопросы с переводом времени :)) но думаю это в пределах допустимого риска :))

B>Все это хозяйство надо привести к искомым восьми байтам. Для этого подойдет какой-либо алгоритм генерации "дайджеста" сообщения (вот к примеру MD5, тоже в сети полным-полно; он, правда, дает вовсе не восемь байт, а больше, но можно как минимум идею почерпнуть).


А вот об этом можно поподробнее, плс? Ссылки приветствуются.

С уважением Александр.
Re[3]: Как создать уникальный ID? (в double)
От: maxp Россия http://penzin.ru/
Дата: 09.12.01 12:43
Оценка:
SA>Это здравая мысль, она мне приходила в голову, и я ее наверняка буду использовать. (Хотя вопросы с переводом времени но думаю это в пределах допустимого риска

B>>Все это хозяйство надо привести к искомым восьми байтам. Для этого подойдет какой-либо алгоритм генерации "дайджеста" сообщения (вот к примеру MD5, тоже в сети полным-полно; он, правда, дает вовсе не восемь байт, а больше, но можно как минимум идею почерпнуть).


SA>А вот об этом можно поподробнее, плс? Ссылки приветствуются.


есть такое ощущение, что в double нельзя писать прямо любые
биты, какие захочется, ведь его где-то обрабатывают помимо этого
и могут ненароком нарваться на NaN.
т.е. хорошо было бы все представлять именно в десятичном виде.

при инсталляции системы можно бреть какой-нибудь рандом, запоминать его,
а потом совать в порядок.
мантиссу брать в виде первых цифр десятичного представления
того же MD5 (ищи md5sum.c) по какой-нибудь забавной строке
из текущих миллисекунд и просто инкрементирующегося каунтера,
это чтобы не вставлять задержки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.