Top > DBMS_CRYPTO > DBMS_CRYPTO 使用方法 〜乱数を生成する〜

DBMS_CRYPTO 使用例 〜乱数〜

乱数(ランダム値)を取得する方法

DBMS_CRYPTO RANDOM〜 ファンクション・シリーズ

実行するには実行権限が必要 ⇒ DBMS_CRYPTO 使用方法 〜準備〜

DBMS_CRYPTO.RANDOMBYTES ファンクション

RANDOMBYTES ファンクションは 指定長(2000バイト以下)のバイナリ文字列を戻す関数。

このファンクションは暗号化キーの使用を想定したファンクションとなっている。
疑似乱数発生器は 公開鍵暗号方式の標準規格 [ANSI] RSA X9.31 PRNG (Pseudo-Random Number Generator) に基づいている。

Randomize のようなジェネレータの初期化やシード値を指定する必要はない。

SQL> select DBMS_CRYPTO.RANDOMBYTES(16) from dual;
 
DBMS_CRYPTO.RANDOMBYTES(16)
-----------------------------------------------------
93B7DFE47F7A5252F31A8172A2BADBD5

DBMS_CRYPTO.RANDOMINTEGER ファンクション

RANDOMINTEGER ファンクションは BINARY_INTEGER の乱数を戻す関数。
DBMS_RANDOM.RANDOM と同じスペックを満たすファンクションである。
範囲は -2^31 〜 2^31-1 までの整数 となる。(約±21億)

SQL> select DBMS_CRYPTO.RANDOMINTEGER from dual;
 
RANDOMINTEGER
-------------
    797468639
SQL> select DBMS_CRYPTO.RANDOMINTEGER from dual;
 
RANDOMINTEGER
-------------
  -2083004845

DBMS_CRYPTO.RANDOMNUMBER ファンクション

RANDOMNUMBER ファンクションは NUMBER 型で 「0 以上の整数」 の乱数を戻す関数。
範囲は 0 〜 2^128-1 までの整数 となる。(0 〜 約 3.40282367×10^38 / 1京 は 10^16)

SQL> select DBMS_CRYPTO.RANDOMNUMBER from dual;
 
                            RANDOMNUMBER
----------------------------------------
 164967821121633246545742120077570702843

DBMS_RANDOM と DBMS_CRYPTO

DBMS_RANDOM パッケージの乱数発生ファンクション RANDOM は Oracle 11g マニュアルで 廃止予定の注意書き付き になっている。

DBMS_RANDOM パッケージは安全な乱数ではない(※)とか、使用前後に INITIALIZE、TERMINATE しないといけないなど 何かと不便でしたが、DBMS_CRYPTO の RANDOMINTEGER ファンクションへのエイリアスにならないのでしょうか。

(※) DBMS_RANDOM の乱数は SEED プロシージャを同一値で 2度 コールすると同じ乱数群を再現できる仕様のため再現テストに利用できる。

再現性のある擬似乱数 (value ファンクションは 廃止予定 ではない)

SQL> call dbms_random.seed(123);
SQL> call dbms_random.seed(123);
 
SQL> select
  2   dbms_random.value(), dbms_random.value(),
  3   dbms_random.value(), dbms_random.value()
  4   from dual;
 
DBMS_RANDOM.VALUE() DBMS_RANDOM.VALUE() DBMS_RANDOM.VALUE() DBMS_RANDOM.VALUE()
------------------- ------------------- ------------------- -------------------
         .586161144          .670158807          .390244602          .364094791
 
SQL> call dbms_random.seed(123);
SQL> call dbms_random.seed(123);
 
SQL> select
  2   dbms_random.value(), dbms_random.value(),
  3   dbms_random.value(), dbms_random.value()
  4   from dual;
 
DBMS_RANDOM.VALUE() DBMS_RANDOM.VALUE() DBMS_RANDOM.VALUE() DBMS_RANDOM.VALUE()
------------------- ------------------- ------------------- -------------------
         .586161144          .670158807          .390244602          .364094791

実際は 1度のコールで同じになる…でも大事なテストなら素直に2つ書く方が安心 (Oracle 11g R2)

SQL> call dbms_random.seed(321);
SQL> call dbms_random.seed(123);
 
SQL> select
  2   dbms_random.value(), dbms_random.value(),
  3   dbms_random.value(), dbms_random.value()
  4   from dual;
 
DBMS_RANDOM.VALUE() DBMS_RANDOM.VALUE() DBMS_RANDOM.VALUE() DBMS_RANDOM.VALUE()
------------------- ------------------- ------------------- -------------------
         .586161144          .670158807          .390244602          .364094791
 


乱数、暗号化、ハッシュ関数 関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)