oracle中的几个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%左右。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8394333/viewspace-996186/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8394333/viewspace-996186/

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值