发布日期:2015-11-06 13:41 来源: 标签: 数据库 oracle教程 oracle函数 oracle hash函数
本章我们主要学习Oracle中常用hash函数有哪些,如何使用这些hash函数?下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。

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%左右。

相关评论

专题信息
    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间件。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;本教程主要是针对oracle应用过程中我们常用的函数进行深入讲解,让大家能够通过代码实例更快、更有效的掌握oracle函数,希望对大家有所帮助。