oracle中的幾個hash函式

sunwgneuqsoft發表於2007-12-29

ORACLE 中提供了幾種HASH的函式,主要包括下面三種MD4MD5SH1。我知道常用的函式呼叫方法如下:

1, 這個函式不知道具體的哪種演算法,不過這個應該是最常用的一個HASH函式了

select dbms_utility.get_hash_value('1',1,100) from dual;

2, HASH_MD4 (128 bit hash)

select dbms_crypto.hash('aaaa',1) from dual;

3, HASH_MD5 (128 bit hash)

select dbms_crypto.hash('aaaa',2) from dual;

4, HASH_SH1 (160 bit hash)

select dbms_crypto.hash('aaaa',3) from dual;

[@more@]

其實還有一個加密的函式DBMS_OBFUSCATION_TOOLKIT.md5,這個就不進行測試了,估計和上面的MD5效率應該差不多。主要就測試上面四個主要HASH的效率。

現在首先需要建立一個很大很大的表,然後用上面四個函式分別做測試,根據執行的時間來大概的判斷各種演算法的效率。

首先建立一張比較大的表

SQL> create table sunwg (id varchar2(4000));

Table created

SQL> insert into sunwg

2 select

3 rownum ||

4 a.OWNER ||

5 a.OBJECT_NAME ||

6 a.SUBOBJECT_NAME ||

7 a.OBJECT_ID ||

8 a.DATA_OBJECT_ID ||

9 a.OBJECT_TYPE ||

10 a.CREATED ||

11 a.LAST_DDL_TIME ||

12 a.TIMESTAMP ||

13 a.STATUS ||

14 a.TEMPORARY ||

15 a.GENERATED ||

16 a.SECONDARY ||

17 rownum ||

18 a.OWNER ||

19 a.OBJECT_NAME ||

20 a.SUBOBJECT_NAME ||

21 a.OBJECT_ID ||

22 a.DATA_OBJECT_ID ||

23 a.OBJECT_TYPE ||

24 a.CREATED ||

25 a.LAST_DDL_TIME ||

26 a.TIMESTAMP ||

27 a.STATUS ||

28 a.TEMPORARY ||

29 a.GENERATED ||

30 a.SECONDARY as id

31 from dba_objects a,

32 dba_objects b

33 where rownum < 5000001;

已建立5000000行。

SQL> commit;

SQL> select bytes/1024/1024,blocks from user_segments where segment_name='SUNWG';

BYTES/1024/1024 BLOCKS

--------------- ------------------------------

840 107520

這樣構件了一個有5百萬不同記錄的大表,大概佔用了107520個資料塊。

下面用這個四種HASH函式分別做下測試

(1) dbms_utility.get_hash_value

SQL> create table sunwg_get_hash as select dbms_utility.get_hash_value(utl_raw.cast_to_raw(id),1,10000000) id from sunwg;

Table created

Executed in 152.844 seconds

(2) HASH_MD4 (128 bit hash)

SQL> create table sunwg_HASH_MD4 as select dbms_crypto.hash(utl_raw.cast_to_raw(id),1) id from sunwg;

Table created

Executed in 193.734 seconds

(3) HASH_MD5 (128 bit hash)

SQL> create table sunwg_HASH_MD5 as select dbms_crypto.hash(utl_raw.cast_to_raw(id),2) id from sunwg;

Table created

Executed in 193.016 seconds

(4) HASH_SH1 (160 bit hash)

SQL> create table sunwg_HASH_SH1 as select dbms_crypto.hash(utl_raw.cast_to_raw(id),3) id from sunwg;

Table created

Executed in 196.469 seconds

因為下面三個函式都需要輸入是RAW型別,為了公平起見,在第一個例子中我也增加了RAW的轉化,而且每次執行之前都重啟動資料庫。

但是上面的結果很奇怪,MD4演算法應該比MD5要慢一些,可是從結果上去是兩者執行的時間差不多。還有一點是dbms_utility.get_hash_value演算法要比其他的快得多。想了半天,覺得dbms_utility.get_hash_value演算法的速度應該是和引數HASH_SIZE有關係。

下面做個測試對比一下,僅貼出測試結果吧

HASH_SIZE

TIMING

1

143

1000

142

1000000

137

1000000000

136

1500000000

136

2000000000

136

結果和預料完全不一樣,那說明dbms_utility.get_hash_value演算法的速度應該是和引數HASH_SIZE並沒有什麼關係。

那到底為什麼dbms_utility.get_hash_value會比其他幾種方式快呢,我猜測估計是他們的抗衝突性差距是特別大的,所以才會在時間差得這麼多。

最後說一下,這些操作真的是相當的費CPU,在測試過程中CPU使用率一直在50%左右。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8394333/viewspace-996186/,如需轉載,請註明出處,否則將追究法律責任。

相關文章