Подпрограмма REXX, которая вернет уникальную строку

Я хочу определить функцию, которая возвращает уникальную строку при каждом вызове. Возвращаемое значение этой функции должно быть уникальным в течение следующих 50 лет. Вот что я пробовал:

k.rand=USERID()
do i=1 to 10 by 1
 n=RANDOM(1,26)
k.i=word('a b c d e f g h I j k l m n o p q r s t u v w x y z ',n)
m.i= WORD('@ ! # $ % ^ * 1 2 3 4 5 6 7 8 9',i)
k.rand=k.rand ||k.i ||m.I
END
say k.rand

person hotcoder    schedule 01.10.2018    source источник
comment
Что вы пробовали???, вы хотите, чтобы внешняя функция была написана на rexx (или другом языке   -  person Bruce Martin    schedule 01.10.2018
comment
Как часто должно генерироваться это значение? Ежедневно? Каждую секунду? Если каждую секунду вы можете генерировать достаточное количество уникальных значений, чтобы покрыть промежуток времени — я не буду заниматься математикой? Вам нужен УНИКАЛЬНЫЙ или СЛУЧАЙНЫЙ? Как уже говорилось, рандом не обязательно будет производить уникальные токены за этот период. Если вам нужен уникальный, то почему бы не использовать простой счетчик?   -  person NicC    schedule 03.10.2018
comment
@NicC прав. Лично я бы использовал текущее время и дату как часть строки или случайное начальное число.   -  person paulywill    schedule 03.10.2018


Ответы (3)


На нашем сайте есть несколько инструментов REXX, которые при вызове отправляют задания на мэйнфреймы. Например, если вы вызываете инструмент для набора данных, задание будет отправлено в фоновом режиме для определения количества записей в наборе данных.

В определенный момент инструмент REXX может быть запущен N раз. Чтобы избежать дублирования имен заданий в спуле, мы придумали что-то вроде приведенного ниже.

NUM = RANDOM(000,999)
JOBNAME=USERID()||NUM    

И USERID(), и RANDOM() встроены в функции REXX.

USERID() возвращает идентификатор пользователя TSO/E. Подробнее здесь< /а>.

RANDOM возвращает случайное число. Подробнее здесь< /а>.

здесь приведен фрагмент кода, который вы можете попробовать.

person Srinivasan JV    schedule 01.10.2018
comment
Спасибо. Это полезно. Но другой вопрос: значение не будет повторяться следующие 50 лет (сгенерированная строка). - person hotcoder; 01.10.2018
comment
Нет никакой гарантии, что они когда-либо будут уникальными. Это случайное число. Вы можете запустить его дважды подряд и получить тот же результат. вероятность того, что вы получите ту же строку, составляет 1 из 1000. Если это должно быть уникальным в течение следующих 50 лет, вам понадобится другое решение. - person SaggingRufus; 01.10.2018
comment
@hotcoder В Руководстве нет информации о том, как долго числа будут случайными. Однако в руководстве говорится, что функция будет return a quasi-random nonnegative whole number. The numbers are generated mathematically, using the initial seed, so that as far as possible they appear to be random. Running the program again produces the same sequence; using a different initial seed almost certainly produces a different sequence. If you do not supply a seed, the first time RANDOM is called, an arbitrary seed is used. Hence, your program usually gives different results each time it is run. - person Srinivasan JV; 01.10.2018
comment
На нашем сайте мы запустили несколько заданий одновременно, и ни одно из заданий не имело одинакового имени задания (Примечание: USERID() возвращает одно и то же значение, скажем, «SRINI». Это RANDOM() значение функции + USERID(), что делает имя задания уникальным ). - person Srinivasan JV; 01.10.2018
comment
@hotcoder это может сработать, но нет гарантии, что это сработает. Все, что вы здесь делаете, это берете 10 случайных символов и связываете их вместе. Да, это МОЖЕТ привести к желаемому результату (если вам повезет), но, наоборот, если вам не повезет, их имена не будут уникальными. - person SaggingRufus; 01.10.2018
comment
@SrinivasanJv, вы можете быть уверены, что он может создавать полуслучайные имена заданий, даже если это так, я почти уверен, что все системы JES могут обрабатывать 2 задания с одним и тем же именем (одно просто подождет, пока другое не завершится, прежде чем начнется), но если вам нужно что-то, чтобы быть уникальным в течение следующих 50 лет, это не может сделать это с определенной степенью уверенности. Особенно, когда семя произвольное. - person SaggingRufus; 01.10.2018
comment
@SaggingRufus Я согласен с вашей точкой зрения, и я знаю, что системы JES могут обрабатывать 2 задания с одинаковым именем, и последнее будет ждать завершения первого задания. Но если имя задания уникально, они будут выполняться одновременно, поскольку задания не используют общий ресурс. Мы преодолели эту проблему с помощью фрагмента кода, которым я поделился в этом ответе. Первоначальный вопрос ОП был связан с тем, над чем я работал в прошлом, и я подумал, что поделюсь им в этом ответе. Я действительно согласен с тем, что фрагмент кода в моем ответе не может дать уникальных результатов в течение следующих 50 лет. Спасибо за ваши предложения! - person Srinivasan JV; 02.10.2018
comment
Я получил решение путем объединения со временем. - person hotcoder; 03.10.2018
comment
@hotcoder Было бы полезно, если бы вы могли отредактировать фрагмент кода в вопросе с тем, что вы пробовали. - person Srinivasan JV; 03.10.2018
comment
@hotcoder Итак, вы принимаете это как ответ, хотя он не имеет отношения к вашему окончательному решению? Ничто в этом ответе не гарантирует, что требования исходной задачи будут выполнены. - person Rich Jackson; 25.10.2018

В Rexx нет встроенной функции UUID. Walmart Labs открыла сервис на основе z/OS, который генерирует UUID с гарантией до 34 000 года :)

zUID — это облачная служба в среде z/OS, которая генерирует уникальный идентификатор с использованием специального алгоритма, на который заявлен патент. Гарантировано создание 100% уникальных идентификаторов до 34 000 года без необходимости управления системой базы данных.

Сервис возвращает UID в 3 различных шестнадцатеричных форматах: обычный, guid и ess в текстовом формате. Они не завернуты в структуры XML или JSON.

простой: 32 байта, 1234567890abcdef1234567890abcdef
ess: 34 байта, 12345678-90abcdef12345678-90abcdef
guid: 36 байт, 12345678-90ab-cdef-1234-567890abcdef

Для этой услуги авторизация не требуется.

В дополнение к веб-доступу вы можете вызывать эту подпрограмму напрямую, используя команду CICS LINK в своих программах COBOL. Интерфейс HTTP был разработан, чтобы сделать его доступным для большего числа пользователей за пределами среды z/OS.

person Hogstrom    schedule 01.10.2018
comment
Спасибо. Я просто ищу только функцию, которая будет генерировать уникальный идентификатор с использованием REXX. - person hotcoder; 02.10.2018
comment
я понимаю. Создание случайной строки — это одна часть, а обеспечение ее уникальной идентификации в течение определенного периода времени — более сложная часть. - person Hogstrom; 02.10.2018
comment
@Hogstrom Я действительно нашел информацию в этом ответе полезной. Я просто не могу попробовать эту услугу на своем сайте, поскольку у нас нет полномочий загружать и устанавливать такие службы самостоятельно. Я планирую попробовать это (вместе с эмулятором Hercules) на моей локальной машине. Большое спасибо! - person Srinivasan JV; 02.10.2018

Вы используете REXX в системе z/OS? Если это так, вы можете сгенерировать уникальные числа с помощью инструкции STCKE STORE CLOCK EXTENDED, которые будут уникальными в течение тысяч лет при генерации в той же системе или сисплексе с синхронизированными часами.

Вам нужно взломать ассемблер, чтобы написать внешнюю функцию REXX.

STCKE    RSECT                                                         
STCKE    AMODE 31                                                      
STCKE    RMODE ANY                                                     
         SAVE  (14,12)                                                 
         LR    R12,R15                                                 
         USING STCKE,R12                                               
         USING EFPL,R1           REXX external function parameter list 
         L     R4,EFPLEVAL                                             
         L     R4,0(R4)          REXX evaluation block                 
         USING EVALBLOCK,R4                                            
         STCKE EVALBLOCK_EVDATA  Store STCKE in the function result area   
         MVC   EVALBLOCK_EVLEN,=F'16' length of result (STCKE)         
         LA    R15,0             RC=0                                  
         RETURN (14,12),RC=(15)                                        
         YREGS                                                         
         IRXEFPL                                                       
         IRXEVALB                                                      
         END     

И убедитесь, что вы установили numeric digits в коде REXX, так как STCKF — это огромное 16-байтовое число!

/* REXX */            

numeric digits 64     

do 10                 
  raw = stcke()       
  hex = c2x(raw)      
  num = x2d(hex)      
  say hex num         
end
person David Crayford    schedule 12.11.2018
comment
@SaggingRufus Да, и ему чуть больше 50 лет. Судя по коду Walmart, он будет уникальным до 34 000 года, когда будет продлен расширенный TOD. Конечно, он уникален только для LPAR или sysplex, на котором он работает, поэтому, чтобы сделать его более детализированным, добавьте строку, такую ​​как имя LPAR или имя Plex. Это то, что делают генераторы UUID на других платформах, когда используют MAC-адрес. - person David Crayford; 20.11.2018