2020年5月21日 星期四

字元亂數

先前亂數(Random)文章中曾探討MSSQL使用NEWID()函數ORACLE使用DBMS_RANDOM套件以產生亂數(Random產生0.01.0(不含)的浮點數,本文將探討字元亂數的產生常用於使用者管理隨機產生密碼需求。

MSSQL可採用NEWID()函數可產生每次都不同且不重複的全域唯一辨識項(Globally Unique IdentifierGUDI),處理後即可滿足所需產生
ORACLE 10g提供字元亂數套件DBMS_RANDOM.STRING可指定大小寫文數字等多種型式組合語法請參本文下方兩種資料庫取得510碼之亂數SQL及執行結果如下:

SQL
執行結果
MSSQL
SELECT LEFT(REPLACE(NEWID(), '-', ''), 10)  random
FROM master.dbo.spt_values N
WHERE 1=1
         AND N.type ='P'
         AND N.number<5
ORACLE
SELECT DBMS_RANDOM.STRING('X', 10)  random
FROM DUAL
CONNECT BY LEVEL <=5


ORACLE
DBMS_RANDOM.STRING(opt, len)
第一個參數(opt)為形式(如下表),第二個參數(len)為回傳字串長度,各種形式參數及範例如下。
參數
說明
範例
U
大寫字母(uppercase alphabets
NEBKRFYQVURYNKAWYAWI
L
小寫字母(lowercase alphabets
idpnjsxvjbmlohmertfa
A
大、小寫字母(mixed-case alphabets
POsGlkbnMqCTwMWEiFSc
X
大寫字母及數字(uppercase alphabets and numbers
JYNW2H1YSVP61D12U4AM
P
可視字元(printable characters
Qz3<>uQ5Fpc4`quAit)P
SQL語法如下可自行測試
SELECT DBMS_RANDOM.STRING('U', 10) "U(大寫字母)"
       , DBMS_RANDOM.STRING('L', 10) "L(小寫字母)"
       , DBMS_RANDOM.STRING('A', 10) "A(大小寫字母)"
       , DBMS_RANDOM.STRING('X', 10) "X(大寫及數字)"
       , DBMS_RANDOM.STRING('P', 10) "P(可視字元)"
FROM DUAL
CONNECT BY LEVEL <=5

MSSQL
MSSQL亦可使用CRYPT_GEN_RANDOM函數函數傳回 Crypto API (CAPI) 所產生的密碼編譯隨機數字
CRYPT_GEN_RANDOM( len [ , seed ] )
      第一個參數(len)為回傳字串長度,第二個參數為隨機種子值(選擇性參數)
SELECT CAST(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:column("rnd")))'
, 'varchar(max)') Random
FROM
       (
       SELECT N.number No
           , CAST(CRYPT_GEN_RANDOM(8) AS VARBINARY(max)) rnd
       FROM master.dbo.spt_values N
       WHERE 1=1
                AND N.type ='P'
                AND N.number<5
       ) A



沒有留言:

張貼留言