Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Вниз"Уникальный" идентификатор Найти похожие ветки
← →
{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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c