![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Уникальный" идентификатор
{RASkov} © (2007-05-15 01:26:00)Никто не задавался такой целью написать функцию возвращающую уникальный идентификатор?
GUID не нужен, что нибудь проще, мне достаточно
1:100000 - вполне хватит
1:50000 - достаточно
1:5000 - предел достаточности.
Т.е. уникальность - раз к 5000-100000... или другими словами например на 10000 компах запустить копии одной проги с копкой по нажатию которой выдается сообщение с этим ID, вообщем нужно так, чтоб совпадений было минимум, или вообще не было. Условие - один раз нажать на кнопку на каждом компе и сравнить все результаты. У меня первое что приходит на ум - это системная дата, плюс небольшая ее модификация. Хотелось бы числом возвращать(все это дело(ID) будет в базе), но можно и строкой 8-12 символов....
Собственно я сделал с датой и символами, но проверить ее не могу или не знаю как, хотелось бы посмотреть на другие варианты. Спасибо.
{RASkov} (2007-05-15 18:21:00) [1]В общем остановился на этом (может кому и пригодится):
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 и обреж
Тоже вариант....
Ладно... всем спасибо за участие ;)
Kolan (2007-05-15 07:46:00) [2]> GUID не нужен, что нибудь проще, мне достаточно
Возьми GUID и обреж
Gydvin (2007-05-15 07:22:00) [3]А смысл?
{RASkov} (2007-05-15 02:50:00) [4]> 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);
{RASkov} (2007-05-15 02:45:00) [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 и последней позиции... Ну это уже придирки, ладно счас еще покалдую, не получится (а я не верю:)) то оставлю как есть ;) Возможно ошибочный вариант бросил, но идея она самая....
Германн (2007-05-15 02:32:00) [6]Ну а Random попробовал добавить?
{RASkov} (2007-05-15 02:04:00) [7]> Номердолжен
Идентификатор
{RASkov} (2007-05-15 01:55:00) [8]> [1] Германн © (15.05.07 01:36)
Номер должен генериться на разных компьютерах и добавляться в одну общую базу.
>
ЗЫ Если нет предложений счас выложу свое, дабы покритиковать :)
Германн (2007-05-15 01:36:00) [9]
> {RASkov} © (15.05.07 01:26)
Не понял, чем не устроило с датой?
Ну и ещё можно добавить Random, имхо.