Получить некое уникальное значение (желательно чисто цифровое)

Тема в разделе "Lotus - Программирование", создана пользователем Omh, 2 мар 2011.

  1. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Камрады, моё почтенде!

    Встала задача получить некое уникальное значение (будет использоваться как название для папки).
    @Unique не катит, т.к. там участвует часть имени пользователя, а соответсвенно могут вылезти кириллица, всякие умляуты и т.д.
    Т.е. очень желательно получить уникальное цифровое значение.

    Какие значения были до этого, я не знаю, т.е. принцип "предидущее значение + 1" не годиться.

    В течении секунды может быть сгенерировано n уникальных значений, т.е. текущее время тоже пролетает.

    В идеале, цикл выполняющийся в пределах секунды
    Код (LotusScript):
    For i = 1 To 100
    Print UniqueValue()
    Next
    должен выпечатаь 100 значений, но, по идее, сгодиться и если число сгенерированных значений будет >80 думаю мне этого хватит.

    Пока что смотрю в сторону
    Код (LotusScript):
    Randomize
    UniqueValue = Cstr(Rnd()) + Cstr(Getthreadinfo(6)) ' LSI_THREAD_TICKS
    Но такая конструкция выполненная в цикле менее секунды 100 выдаёт только 11 уникальных значений.
    Куда бы добавить соли?
    Спасибо!

    Можно, конечно ввести глобальный счётчик, но пока не хотелось бы.
    Ани айдиас аппришиэйтед!

    Добавлено: Ща попробовал с глобальным счётчиком, вообще работает.
    Т.е. объявил ненавистную мной глобальную переменную и использую её как часть уникального значения.
    Т.е. в пределах одного запуска цикла всё получается, как надо.

    Добавлено: Уточню, что мне вообще и надо в пределах одного запуска.
    Вообщем, похоже, проблема решена с помощью приватной глобальной переменной.
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    почему бы в Уникью просто не заменять кирилицу ?
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Morpheus
    В России - кириллица
    В Латвии - латышица
    В Замбии - замбица
    Не хочу заморачиваться.

    Но вообще, если потеоретизировать насчёт сферического коня в вакууме, то возможно ли не используя глобальную переменную всё время генерировать уникальные значения?
    Что-то мне подсказывает, что это не совсем тривиальная задача.
     
  4. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    нууууууууу... может просто плодить документы и брать их нотеИд

    Добавлено: и возможно j2ls + ( JAVA-рандом ) будет быстрее?
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
  6. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну, чем просто прибавлять единичку к глоб. переменной - вряд ли.
    Я просто не понимаю, почему это я думал, что мне надо уникльное значение вне времени и пространства.
    На самом деле, мне надо было уникальное значение в пределах запуска, что решается, как 2 пальца об асфальт.
    Вообщем, протормозил я :)

    Добавлено:
    Типа создавать временные документы в пямяти и брать их UNID?
    Можно, как вариант.
    Но, мне на самом деле, такой способ не очень нравится.
    Как то мне не по душе деланье пустышек, которые потом и удаляются.


    Кстати, таким способом у меня сделано получаение серверного времени:
    Код (LotusScript):
    Dim newDoc as NotesDocument
    Set newDoc = db.CreateDocument
    ServerTime = NewDoc.Created
    Под шумок спрошу, ни у кого нет лучше способа без пустышки и без Evaluate(Formula)?
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Создаешь папку, смотришь её UNID и меняешь имя на этот UNID.
     
  8. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    переводи дату+время в число
     
  9. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Код (Text):
    CDat(Now)
    ?
    А что вернёт в пределах секунды?
    Я не злорадствую, а просто спрашиваю, пока нет времени проверить.
     
  10. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
  11. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    необязательно документы создавать, можно @password использовать
     
  12. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Генерить любой уникальный текст, хоть и тот же @Unique, и переделать в какой MD5 хеш. Да и nvy хорошенький линк подкинул.
     
  13. nayke

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    либо

    Код (Text):
    Type KFM_PASSWORD
    xType As Byte
    hPword As String * 48
    End Type

    Declare Sub SECKFMCreatePassword Lib "nnotes.dll" (Byval pString As String, x As KFM_PASSWORD)
    Это если без формул и Evaluate()
     
  14. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    А так не проще?
    hashedPassword$ = notesSession.HashPassword( password$ )
     
Загрузка...

Поделиться этой страницей