Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1179065009
aha
2007-05-13 18:03
2007.06.03
еще вопросик - как организовать , чтобы при нажатии любой кнопки


15-1178841415
P
2007-05-11 03:56
2007.06.03
Округление


15-1178092102
Alkid
2007-05-02 11:48
2007.06.03
Появилось стойкое желание...


15-1178165684
H
2007-05-03 08:14
2007.06.03
.htaccess


2-1179101593
Gringoire
2007-05-14 04:13
2007.06.03
Запрос SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский