欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[20191012]使用bash从sql_id计算hash_value.txt

程序员文章站 2022-07-05 08:58:50
[20191012]使用bash从sql_id计算hash_value.txt--//没有什么实际意义,仅仅验证方法是否可行.--//sql_id的计算是使用MD5算法进行哈希,生成一个128位的Hash Value,其中低32位作为HASH VALUE显示,SQL_ID则取了后64位。--//实际 ......

[20191012]使用bash从sql_id计算hash_value.txt

--//没有什么实际意义,仅仅验证方法是否可行.
--//sql_id的计算是使用md5算法进行哈希,生成一个128位的hash value,其中低32位作为hash value显示,sql_id则取了后64位。
--//实际上sql_id使用32进制表示,hash_value使用10进制表示。

1.测试数据:

select * from emp where deptno=10;
--//查询可以知道sql_id='557p4j1ggw222'.

scott@book> select sql_text c70,sql_id,hash_value  from v$sql where sql_id = '557p4j1ggw222';
c70                                sql_id        hash_value
---------------------------------- ------------- ----------
select * from emp where deptno=10  557p4j1ggw222 1593706562

scott@test01p> select /*+ 12345678abdef */ sysdate from dual ;
sysdate
-------------------
2019-10-11 22:34:56
---//sql_id=0p0rzks2gkrj6

scott@test01p> select name c70,hash_value,full_hash_value from v$db_object_cache where  hash_value=83451430;
c70                                           hash_value full_hash_value
--------------------------------------------- ---------- --------------------------------
select /*+ 12345678abdef */ sysdate from dual   83451430 ef5a2c4876c9e93d0a82ff9604f95e26
select /*+ 12345678abdef */ sysdate from dual   83451430 ef5a2c4876c9e93d0a82ff9604f95e26

--//sql_id = 557p4j1ggw222 ,hash_value = 1593706562
--//sql_id = 0p0rzks2gkrj6 ,hash_value = 83451430

2.测试:
$ echo 557p4j1ggw222  0p0rzks2gkrj6 | xargs.exe -n 1  ./s2p.sh
sql_id=557p4j1ggw222 hash_value = 1593706562
sql_id=0p0rzks2gkrj6 hash_value = 83451430
--//对比上面都能对上.

3.执行脚本s2p如下:

$ cat s2p.sh
#! /bin/bash
# convert sql_id to hash_value

odebug=${odebug:-0}

sql_id="$*"
v1=$(echo $sql_id | tr $(echo {0..9} {a..z} | tr -d 'eilo ') $( echo {0..9} {a..v}| tr -d ' '))
v2=$(( 32#$v1 % 2**32 ))
if [ $odebug -eq 1 ] ; then
echo "sql_id=$sql_id v1=$v1 v2=$v2"
fi
echo "sql_id=$sql_id hash_value = $v2"