Страница: 1 |
Страница: 1 |
Вопрос: уникальный индитификатор
Добавлено: 14.01.06 17:56
Автор вопроса: bas | Web-сайт:
Программа создает файлы, в файл нужно зашить уникальный! индитификатор. Вот как его лучше генерить?
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #1
Добавлено: 14.01.06 18:10
GUID генерь.
Private Declare Sub CoCreateGuid Lib "ole32.dll" (ByRef pguid As GUID)
Номер ответа: 2
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #2
Добавлено: 14.01.06 19:45
серийники железа...
Номер ответа: 3
Автор ответа:
bas
Вопросов: 16
Ответов: 30
Web-сайт:
Профиль | | #3
Добавлено: 14.01.06 19:49
причем здесь серийники железа...
Прога создает много файлов и каждый файл должен содержать свой ID
Номер ответа: 4
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #4
Добавлено: 14.01.06 22:14
в вопросе не указано относительно чего нужна уникальность, если задача - фонарёвый ID, тогда
Randomize Timer
ID = int (rnd * 9999999999)
open file$ for output as #1
Print #1, ID
Close #1
Номер ответа: 5
Автор ответа:
AlexF
Вопросов: 20
Ответов: 113
Профиль | | #5
Добавлено: 14.01.06 23:15
Уникальный идентефикатор - можно использовать дату ж формате YYYYMMDDHHNNSS. Соответственно, преобразоват'. Например такими функциями:
Function Date2Num(strDate As String) As Long
On Error GoTo err_hndl
Dim lngResult As Long
lngResult = CDate(strDate) - 29220
MinMaxLong lngResult, -(2 ^ 15 - 2), 2 ^ 15 - 1
 ate2Num = lngResult
Exit Function
err_hndl:
 ate2Num = 0
End Function
Public Function Hour2Num(H1 as string) as long
On Error GoTo err_hndl
'Do Not Modify These 2 Lines!!!
Dim a, Hr&, mn&, H&
a = InStr(H1$, ":"
If a Then
Hr& = Abs(Val(H1$))
End If
mn& = Val(Mid$(H1$, a + 1))
H& = 60& * Hr& + mn&
If InStr(H1$, "-" Then
H& = -H&
End If
Hour2Num& = H&
Exit Function
err_hndl:
Hour2Num=0
End Function
Function Num2Date(lngCurDat) As String
On Error GoTo err_hndl
Num2Date$ = Format(lngCurDat + 29220, "dd/MM/yyyy"
Exit Function
err_hndl:
Num2Date = ""
End Function
Public Function Num2Hour(N1 as long) as string
On Error GoTo err_hndl
Dim N&, S$, x$, Hr&, mn&
N& = N1&
If N& = 0 Then
Num2Hour$ = "__:__"
Exit Function
End If
If N& < 0 Then
N& = -N&
S$ = "-"
End If
Hr& = N& \ 60&
mn& = Abs(N& Mod 60&
x$ = S$ + Trim$(cstr(Hr&) + ":" + Right$("0" & CStr(mn&, 2)
If Len(x$) < 5 Then
x$ = "0" + x$
End If
Num2Hour$ = x$
Exit Function
err_hndl:
Num2Hour=""
End Function
Номер ответа: 6
Автор ответа:
bas
Вопросов: 16
Ответов: 30
Web-сайт:
Профиль | | #6
Добавлено: 15.01.06 01:46
Ага, ясно, GUID вроде лучше всего...
Во по нему пример нашел:
Private Declare Function CoCreateGuid Lib _
"ole32.dll" (buffer As Byte) As Long
Private Declare Function StringFromGUID2 Lib _
"ole32.dll" (buffer As Byte, ByVal lpsz As Long, _
ByVal cbMax As Long) As Long
Private Function getGUID() As String
Dim buffer(0 To 15) As Byte
Dim s As String
Dim ret As Long
s = String$(128, 0)
' получает численный код
ret = CoCreateGuid(buffer(0))
' преобразуем его в текст,
' используя недокументированную функцию StrPtr
ret = StringFromGUID2(buffer(0), StrPtr(s), 128)
getGUID = Left$(s, ret - 1) ' отсекаем "хвост"
End Function
Номер ответа: 7
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #7
Добавлено: 15.01.06 09:26
Зачем всё так усложнять, писать какие-то функции?
Ты же не пишешь движок для нового криптоалгоритма, где на ГСЧ тратят тонны кода, имхо в данном случае должно быть достатосным что-то типа:
Randomize
num = (Int(Rnd * &H9999999) + 1 * GetTickCount()) / (Second(Time) + 1)
Номер ответа: 8
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #8
Добавлено: 15.01.06 09:57
Потому что если тебе достаточно плюнуть в окно наудачу и быть спокойным, что ни в кого не попал, то кому-то нужна гарантия. Типа простой и понятной функции CoCreateGuid.
Номер ответа: 9
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #9
Добавлено: 15.01.06 10:50
А ты считаешь вероятность получения одного и того же числа с помощью функции, которую привёл я, практически больше вероятности получения одного и того же ID с помощью функции CoCreateGuid?
Причём если t - частота вызова функции - больше 1 сек., то такая вероятность на практике стремится к нулю и ею можно пренебречь, если же t < 1 сек., то достаточно ввести ещё один случайный фактор(например координаты мыши) или же заменить Second(time) и тогда уж точно можно говорить о нулевой практической вероятности совпадения чисел.
Во-первых всё зависит от поставленной задачи и некоторых аспектов её применения, а во-втоорых я написал "имхо", это субъективное мнение.
Номер ответа: 10
Автор ответа:
[root]
Вопросов: 45
Ответов: 1212
Web-сайт:
Профиль | | #10
Добавлено: 15.01.06 11:06
А я думаю идея имя создавать по времени вполне сойдет.
Она реализована в цифровиках, некоторых моделей
Номер ответа: 11
Автор ответа:
[root]
Вопросов: 45
Ответов: 1212
Web-сайт:
Профиль | | #11
Добавлено: 15.01.06 11:08
2BUG(O)R:
Нет я с твоим вариантом не спорю!
И правильно, поставленная задача, будет основным решающим
фактором в решении вопроса!