標準化されている様々なハッシュ値の取得

syntax

STANDARD_HASH ( expr , [ hash_algorithm ] ) Oracle 12c
return [ raw ]

parameter

exprNULL を設定可能な式(数値式、文字列式、日付式、etc)
hash_algorithmハッシュアルゴリズムdefault 'SHA1'

return

  • expr を アルゴリズム hash_algorithm を使用しハッシュ化したバイナリ文字列を戻す。

avail

  • SQL、埋め込みSQL で使用可能、PL/SQL に組み込まれていない。(Oracle 12c R2 時点)

ハッシュアルゴリズム

アルゴリズムには MD5、SHA1、SHA256、SHA384、SHA512 を使用可能 (Oracle 12c R2 時点)
NIST(National Institute of Standards and Technology / 米:国立標準技術研究所)にて標準化されたアルゴリズムなので STANDARD という接頭辞がついていると思われる。⇔ ORA_HASH 関数

STANDARD_HASH 関数の内容

LOB 型と LONG 型以外のメッセージ expr を 指定したハッシュアルゴリズム hash_algorithm を使用してハッシュ値に変換する。
ハッシュアルゴリズムの MD5 は 128 ビット、SHA-1 では 160 ビットのハッシュ値を戻す。SHA-2 では 256 / 386 / 512 ビットの 3種類があり SHA-2 の 512 ビットが一番強度が高い。
引数 expr に NULL を指定しても戻り値は NULL にならない。

DBMS_CRYPTO を使用するには実行権限の付与が別途必要だが、STANDARD_HASH は何もせずに使用できる。
ただし、DBMS_CRYPTO で使用可能な BLOB 型、CLOB 型 を取り扱うことはできない。

STANDARD_HASH の使用例

Database Characterset 文字列のハッシュ

SQL> select STANDARD_HASH('ある文字列', 'SHA256') from dual;
 
STANDARD_HASH('ある文字列','SHA256')
----------------------------------------------------------------
525066005B42EAB9F3618176C397D6E4DB4BDDBBDC8CB6CBE005C430FF32C593

National Characterset 文字列のハッシュ
同一文字列でも Database Characterset の文字列とは異なるハッシュ値となる。

SQL> select STANDARD_HASH(N'ある文字列', 'SHA256') from dual;
 
STANDARD_HASH(N'ある文字列','SHA256')
----------------------------------------------------------------
69CA7248066797F8294D0485212165FD18861D15C76052B959A1CC411261526E

TIMESTAMP のハッシュ

SQL> select STANDARD_HASH(systimestamp, 'SHA256') from dual;
 
STANDARD_HASH(SYSTIMESTAMP,'SHA256')
----------------------------------------------------------------
2BB1BA4D1CF5EB0B5BDEFBD55920151D6D61436D4D9DAA1A8C5A01304AE840A9

NUMBER のハッシュ

SQL> select STANDARD_HASH(0, 'SHA256') from dual;
 
STANDARD_HASH(0,'SHA256')
----------------------------------------------------------------
76BE8B528D0075F7AAE98D6FA57A6D3C83AE480A8469E668D7B0AF968995AC71

NULL 値のハッシュ

SQL> select STANDARD_HASH(NULL, 'SHA256') from dual;
 
STANDARD_HASH(NULL,'SHA256')
----------------------------------------------------------------
E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855

同値でデータ型の異なるハッシュ値について

値は同じでも内部格納形式が異なる場合には別のハッシュ値となる。⇔ バイナリ値が同じであればデータ型が異なっていても同じハッシュ値となる。

単精度浮動小数点型 の 0 / 倍精度浮動小数点型 の 0 / NUMBER 型の 0 のハッシュ値

select
    'NUMBER' data_type, dump(0, 16) dump_value,
    STANDARD_HASH(0, 'SHA1') hash_value
from dual
union select
    'BINARY_DOUBLE', dump(to_binary_double(0), 16), STANDARD_HASH(to_binary_double(0), 'SHA1')
from dual
union all select
    'BINARY_FLOAT', dump(to_binary_float(0), 16), STANDARD_HASH(to_binary_float(0), 'SHA1')
from dual
union all select
    'RAW_FLOAT', dump(hextoraw('80000000'), 16), STANDARD_HASH(hextoraw('80000000'), 'SHA1')
from dual
;
 
DATA_TYPE      DUMP_VALUE			HASH_VALUE
-------------- -------------------------------- ----------------------------------------
BINARY_DOUBLE  Typ=101 Len=8: 80,0,0,0,0,0,0,0	E19F8C6041FD6C4202C739FA01BAF61235724B1E  -- ↓と異なる
NUMBER	       Typ=2 Len=1: 80			C78EBD3C85A39A596D9F5CFD2B8D240BC1B9C125  -- ↓と異なる
BINARY_FLOAT   Typ=100 Len=4: 80,0,0,0		E1798367D1B1ED54425E99F790A986C1FE939414  -- ↓と同じ
RAW_FLOAT      Typ=23 Len=4: 80,0,0,0		E1798367D1B1ED54425E99F790A986C1FE939414  -- ↑と同じ
select
    'DATE' data_type, dump(DATE '2000-01-01', 16) dump_value ,
    STANDARD_HASH(DATE '2000-01-01', 'SHA1') hash_value
from dual
union all select
    'RAW_DATE', dump(hextoraw('D007010100000000'), 16),
    STANDARD_HASH(hextoraw('D007010100000000'), 'SHA1')
from dual
;
 
DATA_TYPE      DUMP_VALUE			HASH_VALUE
-------------- -------------------------------- ----------------------------------------
DATE	       Typ=13 Len=8: d0,7,1,1,0,0,0,0	74AAD6847433C93BB195396757AAECB6E1D2A87C  -- ↓と同じ
RAW_DATE       Typ=23 Len=8: d0,7,1,1,0,0,0,0	74AAD6847433C93BB195396757AAECB6E1D2A87C  -- ↑と同じ

SHA256 や SHA512 でも同様の結果になる。

 


SQL 関数 - STANDARD_HASH 関連

 
アルファベット別 関数一覧 ショートカット
ABCDEFG
HILMNOP
RSTUVWX
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー