|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Мне нужно генерировать случайную строку и на всякий случай проверять, нет ли уже такого значения в таблице. Реализовал при помощи потенциально бесконечного цикла, но может есть более изящный и безопасный вариант? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 19:35 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
romaro Мне нужно генерировать случайную строку и на всякий случай проверять, нет ли уже такого значения в таблице. Реализовал при помощи потенциально бесконечного цикла, но может есть более изящный и безопасный вариант? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 19:48 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
romaro, А чем не устраивает guid? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 20:22 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
romaro может есть более изящный ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 20:53 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Vadim Lejnin А чем не устраивает guid? Присоединяюсь к вопросу. Кроме того, если на самом деле требуется не случайное число, а идентификатор, то как-то в RuOUG представляли в качестве генератора systimestamp ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 21:16 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
andrey_anonymous Vadim LejninА чем не устраивает guid? Присоединяюсь к вопросу.А я нет. Использование guid - это роспись в неспособности постичь предметную область. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 21:29 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Elic andrey_anonymous пропущено... Присоединяюсь к вопросу. Если рассматривать это не как абстрактный вопрос "Как бы вы написали такую функцию", то применительно к любой предметной области его бы просто не было - генерировать ключ, необходимый для бизнес-логики: systimestamp, guid, если нет ничего более адекватного - это уже частности. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 21:38 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
ASNexus systimestamp, guid, если нет ничего более адекватного - это уже частности. Вообще предложение какой-то хрени, не понимая задачи, как минимум непрофессионально. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 21:51 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Elic ASNexus systimestamp, guid, если нет ничего более адекватного - это уже частности. Вообще предложение какой-то хрени, не понимая задачи, как минимум непрофессионально. Согласен - мой вариант был просто ответом на "может есть более изящный и безопасный вариант". Просто чтобы натолкнуть автора на некоторые мысли. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 22:08 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Если это динамические PIN-коды (и их возможное количество невелико), то лучше всего сразу сгенерировать все возможные (допустимые) значения, а для выдачи/активации использовать поле "Статус". Если нужен рандомный пароль (количество возможных значений очень велико), то просто генерировать и проверять на отсутствие коллизий. Соль или префикс позволят снизить вероятность коллизий. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2021, 22:25 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Alibek B. Если это динамические PIN-коды (и их возможное количество невелико), то лучше всего сразу сгенерировать все возможные (допустимые) значения, а для выдачи/активации использовать поле "Статус". Если нужен рандомный пароль (количество возможных значений очень велико), то просто генерировать и проверять на отсутствие коллизий. Соль или префикс позволят снизить вероятность коллизий. я в похожих задачах (в скриптах для тестов) просто зашивал в строку timestamp и session_id. и можно не проверять на уникальность ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 12:22 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
legg и можно не проверять на уникальность Не совсем верно. Проблемы с уникальностью в таком подходе словить можно на хорошем оборудовании. Более того, на практике ловят. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 13:07 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
И они гарантированно всплывут при использовании нескольких серверов. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 13:31 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
andrey_anonymous legg и можно не проверять на уникальность Не совсем верно. Проблемы с уникальностью в таком подходе словить можно на хорошем оборудовании. Более того, на практике ловят. в одну миллионную секунды в одной сессии успевают два вызова влезть? круто. но это если совсем никакой логики нет и просто подряд генерим строки. ну тогда добавить пакетную переменную и инкрементировать ее. сиквенсы и гуиды, как я понимаю, мы не используем. в любом случае в такой задаче я попытался б избавиться от проверки уникальности - обеспечил бы на этапе генерации. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 13:35 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Alibek B. И они гарантированно всплывут при использовании нескольких серверов. это когда несколько инстансов на одной базе? легко исправляется добавлением в строку идентификатора сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 13:40 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Нет, когда разные сервера (физические или виртуальные) с не идеально синхронизированными часами. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 13:42 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
legg в одну миллионную секунды в одной сессии успевают два вызова влезть? Откуда взялась одна миллионная секунды? Не нужно путать разрядность типа данных и разрешающую способность системного таймера. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 13:43 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Alibek B. Не нужно путать разрядность типа данных и разрешающую способность системного таймера. ...глас разума однако. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 13:46 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
legg в одну миллионную секунды в одной сессии успевают два вызова влезть? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 14:13 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Sayan Malakshinov а откуда брать timestamp будешь? Если systimestamp то он как и sysdate вообще внутри одного запроса не меняется - две строчки уже не вставишь: ||rownum :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 10:19 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
andrey_anonymous Alibek B. Не нужно путать разрядность типа данных и разрешающую способность системного таймера. ...глас разума однако. хм.. я ни в коем случае не спорю - полный профан в этой области, но разве разрешающая способность сист ямных таймеров в наше время не в наносекундах измеряется? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 10:20 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Alibek B. Нет, когда разные сервера (физические или виртуальные) с не идеально синхронизированными часами. я systimestamp имел в виду. он же единственный и неповторимый? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 10:23 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
legg разве разрешающая способность сист ямных таймеров в наше время не в наносекундах измеряется? Нет, конечно. legg я systimestamp имел в виду. он же единственный и неповторимый? Ничего не понял. Кто единственный и неповторимый? Если на одном сервере часы отстают на секунду от второго сервера, то и systimestamp на нем через секунду повторит значение со второго сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 10:27 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Alibek B. Ничего не понял. Кто единственный и неповторимый? Если на одном сервере часы отстают на секунду от второго сервера, то и systimestamp на нем через секунду повторит значение со второго сервера. Это я ничего не понял, потому что не имел дела с подобным). По поводу разных серверов - у них ведь есть какой-то уникальный идентификатор? если нет - сделать и запихнуть в контекст или пакетную переменную и конкатенировать к строке. По поводу времени - то , если интенсивность генерации новых строк в самом деле создает риски генерации в один и тот же таймсемп двух строк - таким же образом можно запоминать предыдущее время с текущим и если оно совпадает - добавлять постфикс-счетчик. В любом случае уверен что можно выкрутиться и обеспечить уникальность не дергая каждый раз таблицу. Конечно, если данные в таблицу попадают только через нашу генерилку, нет другого источника данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 10:47 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
legg таким же образом можно запоминать предыдущее время с текущим и если оно совпадает - добавлять постфикс-счетчик Новая папка - копия - копия - копия - копия - копия ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 10:56 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Alibek B. legg таким же образом можно запоминать предыдущее время с текущим и если оно совпадает - добавлять постфикс-счетчик Новая папка - копия - копия - копия - копия - копия кого позвать? ) я опять не понял ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 11:01 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Перефразирую — "совпасть с предыдущим" может не одна запись, а множество. Как должен выглядеть счетчик? select nvl(to_number(substr(pk,instr(pk,'-')+1)),0)+1 from t1 where substr(pk,1,instr(pk,'-')-1)=systimestamp ? Или sequence? Или самодельный sequence из таблицы и хранимой процедуры? Так может быть не делать костыли, а сразу сделать нормальный счетчик? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 11:07 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
Alibek B. Перефразирую — "совпасть с предыдущим" может не одна запись, а множество. Как должен выглядеть счетчик? select nvl(to_number(substr(pk,instr(pk,'-')+1)),0)+1 from t1 where substr(pk,1,instr(pk,'-')-1)=systimestamp ? Или sequence? Или самодельный sequence из таблицы и хранимой процедуры? Так может быть не делать костыли, а сразу сделать нормальный счетчик? сиквенс конечно же решает сразу все. я почему то принял как исходное ограничение -сиквенсы не использовать ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 11:32 |
|
Как бы вы написали такую функцию?
|
|||
---|---|---|---|
#18+
romaro Мне нужно генерировать случайную строку и на всякий случай проверять, нет ли уже такого значения в таблице. Реализовал при помощи потенциально бесконечного цикла, но может есть более изящный и безопасный вариант? В науке и технике это называется псевдо-случайное число. Если оно реализовано правильно - то проверок на уникальность делать не нужно. Но нужно где-то хранить предыдущее состояние этого генератора. Один из самых простых генераторов - линейный конгруэентный . Для его реализации нужны умножение на некий коэффициент и остаток от деления на некое целое число. Вопрос выбора этих чисел - за кадром. Зависит от того какой период псевдо-случайности тебе нужен. И есть еще другой подход. Берешь простой шифр. Например DES в режиме ECB. Берешь sequence. И шифруешь каждое его значение как открытый текст. На выходе будет вполне себе шумящая последовательность длинных blobs. Длину можно регулировать делая padding исходого текста. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 14:49 |
|
|
start [/forum/search_topic.php?author=alvira1984&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
129ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 438ms |
total: | 694ms |
0 / 0 |