Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.03;
Скачать: CL | DM;

Вниз

"Уникальный" идентификатор   Найти похожие ветки 

 
{RASkov} ©   (2007-05-15 01:26) [0]

Никто не задавался такой целью написать функцию возвращающую уникальный идентификатор?
GUID не нужен, что нибудь проще, мне достаточно
1:100000 - вполне хватит
1:50000  - достаточно
1:5000 - предел достаточности.
Т.е. уникальность - раз к 5000-100000... или другими словами например на 10000 компах запустить копии одной проги с копкой по нажатию которой выдается сообщение с этим ID, вообщем нужно так, чтоб совпадений было минимум, или вообще не было. Условие - один раз нажать на кнопку на каждом компе и сравнить все результаты. У меня первое что приходит на ум - это системная дата, плюс небольшая ее модификация. Хотелось бы числом возвращать(все это дело(ID) будет в базе), но можно и строкой 8-12 символов....
Собственно я сделал с датой и символами, но проверить ее не могу или не знаю как, хотелось бы посмотреть на другие варианты. Спасибо.


 
Германн ©   (2007-05-15 01:36) [1]


> {RASkov} ©   (15.05.07 01:26)

Не понял, чем не устроило с датой?
Ну и ещё можно добавить Random, имхо.


 
{RASkov} ©   (2007-05-15 01:55) [2]

> [1] Германн ©   (15.05.07 01:36)

Номер должен генериться на разных компьютерах и добавляться в одну общую базу.
>
ЗЫ Если нет предложений счас выложу свое, дабы покритиковать :)


 
{RASkov} ©   (2007-05-15 02:04) [3]

> Номер должен

Идентификатор


 
Германн ©   (2007-05-15 02:32) [4]

Ну а Random попробовал добавить?


 
{RASkov} ©   (2007-05-15 02:45) [5]

Вот это(ниже) даст тех требований, что в [0] 5000-100000?
Сам думаю, что вполне, но для страховки...
function GetUID: String;
const Ch: array [0..25] of Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     MAXCHAR = 3-1;
var ArrPosCh: array [0..2] of Byte;
   SetPosCh: set of Byte;
   N, K: Byte;
begin
 for N:= 0 to MAXCHAR do ArrPosCh[N]:=0;
 N:=0; SetPosCh:=[];
 Result:=IntToStr(Round((Now-RoundTo(Now, 2))*10000000));
 Randomize;
 while N<=MAXCHAR do begin
  K:=2+Random(Length(Result)-1);
  if not (K in SetPosCh) and not (Pred(K) in SetPosCh) and not (Succ(K) in SetPosCh) then begin
   Include(SetPosCh, K);
   ArrPosCh[N]:=K;
   INC(N);
  end;
 end;
 for N:= 0 to MAXCHAR do Insert(Ch[Random(26)], Result, ArrPosCh[N]);
end;

Вот так хотел сделать, но что-то уже не нравиться, то что в while цикле делаю все это зря :)
При инсерте все равно как хотелось бы не получается(и понятно почему), а хотелось бы(может и зря) чтоб два символа подряд не было, и так же их небыло в 1 и последней позиции... Ну это уже придирки, ладно счас еще покалдую, не получится (а я не верю:)) то оставлю как есть ;) Возможно ошибочный вариант бросил, но идея она самая....


 
{RASkov} ©   (2007-05-15 02:50) [6]

> var ArrPosCh: array [0..2] of Byte;

ArrPosCh: array [0..MAXCHAR] of Byte;

Собственно, для желаемого результата можно массив ArrPosCh отсортировать по возрастанию и
for N:= 0 to MAXCHAR do Insert(Ch[Random(26)], Result, ArrPosCh[N]+N);


 
Gydvin ©   (2007-05-15 07:22) [7]

А смысл?


 
Kolan ©   (2007-05-15 07:46) [8]

> GUID не нужен, что нибудь проще, мне достаточно

Возьми GUID и обреж


 
{RASkov} ©   (2007-05-15 18:21) [9]

В общем остановился на этом (может кому и пригодится):
function GetDID(const F12Ch: Boolean=True): String;
const Ch: array [0..25] of Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     MAXCHAR = 3-1;
var ArrPosCh: array [0..MAXCHAR] of Byte;
   SetPosCh: set of Byte;
   N, K, J, Min, TmpI: Byte;
begin
 for N:= 0 to MAXCHAR do ArrPosCh[N]:=0;
 N:=0; SetPosCh:=[];
 Result:=IntToStr(Round((Now-RoundTo(Now, 2))*10000000));
 Randomize; J:=Length(Result)-(2-ORD(F12Ch));
 while N<=MAXCHAR do begin
  K:=2+Random(J);
  if not ((K in SetPosCh) or (Pred(K) in SetPosCh) or (Succ(K) in SetPosCh)) then begin
   Include(SetPosCh, K);
   ArrPosCh[N]:=K;
   INC(N);
  end;
 end;
 if F12Ch then begin
  for N:=0 to MAXCHAR do begin
   Min:=N;
   for J:=N+1 to MAXCHAR do
    if ArrPosCh[J] < ArrPosCh[Min] then Min:=J;
    TmpI:=ArrPosCh[N];
    ArrPosCh[N]:=ArrPosCh[Min];
    ArrPosCh[Min]:=TmpI;
  end;
  for N:= 0 to MAXCHAR do Insert(Ch[Random(26)], Result, ArrPosCh[N]+N);
 end else for N:= 0 to MAXCHAR do Result[ArrPosCh[N]]:=Ch[Random(26)];
end;

Я подозреваю, что совпадений "не будет никогда". ) С условием, что генериться будет минимум один раз на одном компе. Естественно, если в базе уже будет такой идентификатор, то процедура повториться. Я вот думаю, тот ли участок взял из числа (дата+время) или лишнего от начала отсек....
Кстати, может и не надо символы вставлять, тогда и получится число(как я и хотел)?

> [7] Gydvin ©   (15.05.07 07:22)

Не понял вопроса... в чем смысл функции? - ты спрашиваешь... А неужели не понятно, да и расписывал про все это зря что ли....

> [8] Kolan ©   (15.05.07 07:46)
GUID и обреж

Тоже вариант....
Ладно... всем спасибо за участие ;)



Страницы: 1 вся ветка

Текущий архив: 2007.06.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
15-1178458451
Kostafey
2007-05-06 17:34
2007.06.03
Использование переменной-счетчика цикла после выхода из оного


15-1178300863
vasya123123
2007-05-04 21:47
2007.06.03
Свой инсталлятор / installer


3-1173875512
Сергей М.
2007-03-14 15:31
2007.06.03
Логика работы ADO-компонентов


2-1179215722
asd_
2007-05-15 11:55
2007.06.03
Русская кодировка в DBF


5-1155620540
igorserg
2006-08-15 09:42
2007.06.03
Как сделать активную линию?