Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почти уникальный ID


Страницы:   1 2 3

novichek ©   (2011-03-04 16:22:00) 

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

локальное отделение вероятно будет иметь не более 10 ПК.

Как вы думаете, можно ли использовать для генерации уникального ID записи данную функцию?

ID:= genUniID(kodOtdela)
...

function genUniID(id: byte): Int64;
var
 x: Int64;
 y, m, d, ss: Word;
begin

 x:= id;

 DecodeDate(date, y, m, d);

 y:= y and 15;
 x:= x shl 4;
 x:= x + y;
 x:= x shl 4;
 x:= x + m;
 x:= x shl 5;
 x:= x + d;

 DecodeTime(time, y, m, d, ss);

 x:= x shl 5;
 x:= x + y;
 x:= x shl 6;
 x:= x + m;
 x:= x shl 6;
 x:= x + d;
 x:= x shl 7;
 x:= x + ss;

 x:= x shl 7;

 result:= x + random(128);

end;


это первое что пришло в голову..

может есть какие красивые варианты?
пока опыта ноль..


Противный   (2011-03-04 16:58:00) [41]

> Сергей М. ©   (04.03.11 16:33) [5]
> > GUID будет храниться в строке
> Как будешь хранить - так и будет храниться.
> Не хочешь в строке - храни в Int64


GUID 128-битный. Хотя, если отрезать половину, то влезет. Но надо знать откуда резать, а то уникальности не получится. То есть, есть ньюансы...

> novichek   (04.03.11 16:22)  Как вы думаете, можно ли использовать для генерации уникального ID записи данную функцию?

Использовать время для генерации первичного ключа - не лучшее решение. Точнее, плохое решение. Или ты готов гарантировать точное время на всех компьютерах?


Jeer   (2011-03-04 16:58:00) [42]


> Поэтому выход остается


Составной PK - еще раз.


novichek   (2011-03-04 16:56:00) [43]

Inovet ©, так а что генераторы? в каждом отделе свой сервер. потом общие данные будут стекаться на главный. ещё правда не знаю как, репликации в FireBird нету, прийдется что то мудрить своё..

RWolf © , я х.з., читал умные статьи:
http://www.ibase.ru/devinfo/test2.htm
"Некоторые сервера позволяют хранить GUID в его двоичном представлении, размером 16 байт. В IB нет возможности сохранить двоичное значение в строке, а blob для таких целей использовать будет неэффективно. Поэтому выход остается один - хранить GUID как строку."


Inovet   (2011-03-04 16:39:00) [44]

> [4] novichek   (04.03.11 16:31)
> FireBird как и посоветовали.

Генераторы в нём для этого предназначены.


Jeer   (2011-03-04 16:34:00) [45]

Составной PK


RWolf   (2011-03-04 16:34:00) [46]

typedef struct _GUID {
   unsigned long Data1;
   unsigned short Data2;
   unsigned short Data3;
   unsigned char Data4[8];
} GUID;


и где тут строка?


Сергей М.   (2011-03-04 16:33:00) [47]


> GUID будет храниться в строке


Как будешь хранить - так и будет храниться.
Не хочешь в строке - храни в Int64


novichek   (2011-03-04 16:31:00) [48]

FireBird как и посоветовали.

ну как понимаю GUID будет храниться в строке..

как то ключеврой индекс не хочется иметь строку..


Медвежонок Пятачок   (2011-03-04 16:27:00) [49]

а может просто CoCreateGuid?


RWolf   (2011-03-04 16:27:00) [50]

сгенерировать GUID, конечно.


clickmaker   (2011-03-04 16:26:00) [51]

СУБД какая?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо