oracle中的幾個hash函式
ORACLE 中提供了幾種HASH的函式,主要包括下面三種MD4,MD5,SH1。我知道常用的函式呼叫方法如下:
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 | 1分43秒 |
1000 | 1分42秒 |
1000000 | 1分37秒 |
1000000000 | 1分36秒 |
1500000000 | 1分36秒 |
2000000000 | 1分36秒 |
結果和預料完全不一樣,那說明dbms_utility.get_hash_value演算法的速度應該是和引數HASH_SIZE並沒有什麼關係。
那到底為什麼dbms_utility.get_hash_value會比其他幾種方式快呢,我猜測估計是他們的抗衝突性差距是特別大的,所以才會在時間差得這麼多。
最後說一下,這些操作真的是相當的費CPU,在測試過程中CPU使用率一直在50%左右。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8394333/viewspace-996186/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- hash函式的幾種函式
- oracle幾個函式Oracle函式
- hash函式函式
- php中幾個字串替換函式PHP字串函式
- oracle 系統自帶幾個常用函式Oracle函式
- Oracle translate函式和正則的幾個應用Oracle函式
- 幾個常用函式的使用函式
- ton函式函式hash的兩種形式函式
- HashMap中的hash演算法中的幾個疑問HashMap演算法
- 執行緒中的幾個退出相關函式執行緒函式
- [php]幾個常用函式PHP函式
- <Openssl下hash函式>函式
- 幾個重要的內建函式函式
- 幾個分析函式的比較函式
- php增量Hash函式的使用PHP函式
- Notes中幾個處理多值域的通用函式函式
- python 的幾個常用的函式Python函式
- C#中幾個正規表示式匹配輸入字元的函式C#字元函式
- 幾個令人驚歎的函式影象函式
- mysql幾個時間函式MySql函式
- Hash函式及其應用函式
- JS中建立函式的幾種方式JS函式
- Kotlin中的幾個常用函式let with run also applyKotlin函式APP
- AppDelegate中幾個常用回撥函式的呼叫時機APP函式
- js中在一個函式中引用另一個函式中的函式,可以這麼做JS函式
- oracle中的decode(函式)Oracle函式
- ORACLE中的單行函式Oracle函式
- 關於執行緒的幾個函式執行緒函式
- Kotlin的幾個擴充套件函式Kotlin套件函式
- 關於字串的幾個有用函式 (轉)字串函式
- 字元陣列的幾個應用函式字元陣列函式
- 幾個常見函式的非常見用法函式
- 快速介紹幾個JS函式JS函式
- set容器幾個關鍵函式函式
- 幾個SQL 日期處理函式SQL函式
- 說說Python中的幾個內建函式和表推導Python函式
- Oracle中Decode()函式的使用Oracle函式
- oracle中的chr()和ascii()函式OracleASCII函式