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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8394333/viewspace-996186/