[20160302]关于FULL_HASH_VALUE.txt

[20160302]关于FULL_HASH_VALUE.txt

--昨天想给firefox安装一个计算器插件,无意中发现Calculate Hash的插件:
--它是基于文件来计算MD5,SHA1,理论讲这些算法是一样的,也可以用它来计算FULL_HASH_VALUE值。

1.建立一个文件内容如下:
select * from dept where deptno=10^@

--注意一些问题,因为oracle计算FULL_HASH_VALUE是sql串后面还要加入chr(0),而且在vim下普通的文本文件,vim都会在最后补上0d0a(windows下)。
--所以首先要:set binary,然后转换成16进制模式,输入00,在切换回来保存。

Filename    Size (bytes)    MD5                                 SHA1
a.txt        35             5dc43114e7b9dbbdd574aa4e31f15036    341d98827a8cb1c04095dfe768efe5577ec6b043

2.看看oracle计算的情况:

SCOTT@book> select * from dept where deptno=10;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

--sql_id=4xamnunv51w9j

SCOTT@book> select sql_id,hash_value,sql_text from v$sql where sql_id='4xamnunv51w9j';
SQL_ID        HASH_VALUE SQL_TEXT
------------- ---------- ------------------------------------------------------------
4xamnunv51w9j  911274289 select * from dept where deptno=10

SCOTT@book> select name,full_hash_value from V$DB_OBJECT_CACHE where hash_value=911274289 and rownum=1;
NAME                                     FULL_HASH_VALUE
---------------------------------------- --------------------------------
select * from dept where deptno=10       1431c45dbddbb9e74eaa74d53650f131

--很明显跟上面计算的不一样。再仔细观察可以发现oracle计算的FULL_HASH_VALUE结果,实际上颠倒一下。
--比如后面3650f131 ,颠倒一下31f15036,这样正好对上。

$ cat md5_with_chr0.sql
-- md5.sql computes md5 hash and rearranges bytes for printing on Linux (Little Endian)
--         compare results with V$DB_OBJECT_CACHE.HASH_VALUE (11g)
-- Luca May 2012
-- Note user need execute on DBMS_OBFUSCATION_TOOLKIT
-- usage @md5 'string'
-- Example: @md5 'select 1 from dual'

-- calculated

column md5hash format a100
select lower(rawtohex(UTL_RAW.CAST_TO_RAW(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING =>'&1'||chr(0))))) md5hash from dual;

with calc as (
select lower(rawtohex(UTL_RAW.CAST_TO_RAW(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING =>'&1'||chr(0))))) md5hash from dual
)
select substr(md5hash,7,2)||substr(md5hash,5,2)||substr(md5hash,3,2)||substr(md5hash,1,2)||
       substr(md5hash,15,2)||substr(md5hash,13,2)||substr(md5hash,11,2)||substr(md5hash,9,2)||
       substr(md5hash,23,2)||substr(md5hash,21,2)||substr(md5hash,19,2)||substr(md5hash,17,2)||
       substr(md5hash,31,2)||substr(md5hash,29,2)||substr(md5hash,27,2)||substr(md5hash,25,2) calculated_full_hash
       from calc;

SCOTT@book> @ &r/md5_with_chr0.sql 'select * from dept where deptno=10'
MD5HASH
--------------------------------
5dc43114e7b9dbbdd574aa4e31f15036

CALCULATED_FULL_HASH
--------------------------------
1431c45dbddbb9e74eaa74d53650f131
--这样正好对上了。

--再来重温一下hash_value,sql_id的计算。

--sql_id的计算是使用MD5算法进行哈希,生成一个128位的Hash Value(也就是FULL_HASH_VALUE 32位),其中低32位作为HASH VALUE显示,SQL_ID则取了后64位。
--实际上sql_id使用32进制表示,hash_value使用10进制表示。

--参考链接:http://blog.itpub.net/267265/viewspace-1357292/
--          http://blog.itpub.net/267265/viewspace-1365382/

SELECT hash_value
      ,TO_CHAR (hash_value, 'xxxxxxxx') hex_hash_value
      ,full_hash_value
      ,SUBSTR (full_hash_value, -8) hash_x
  FROM GV$DB_OBJECT_CACHE
WHERE hash_value = 911274289 AND ROWNUM = 1;

HASH_VALUE HEX_HASH_ FULL_HASH_VALUE                  HASH_X
---------- --------- -------------------------------- ----------------
911274289  3650f131 1431c45dbddbb9e74eaa74d53650f131 3650f131

--对比上面的select sql_id,hash_value,sql_text from v$sql where sql_id='4xamnunv51w9j';hash_value对上。

select to_number(substr(full_hash_value,-16),'xxxxxxxxxxxxxxxxxxxx') sql_id10, full_hash_value
from GV$DB_OBJECT_CACHE  WHERE hash_value = 911274289 AND ROWNUM = 1;

            SQL_ID10 FULL_HASH_VALUE
-------------------- --------------------------------
5668471540087320881 1431c45dbddbb9e74eaa74d53650f131

select replace(wmsys.wm_concat(c),',') from (
select c from (
SELECT SUBSTR ('0123456789abcdfghjkmnpqrstuvwxyz', a + 1, 1) c,rownum rn
  FROM (WITH data (a, b)
             AS (SELECT MOD (&1, 32) a, TRUNC (&1 / 32) b FROM DUAL
                 UNION ALL
                 SELECT MOD (b, 32) a, TRUNC (b / 32) b
                   FROM data
                  WHERE b !=0
                  )
        SELECT a
          FROM data)) order by rn desc);
--带入5668471540087320881

REPLACE(WMSYS.WM_CONCAT(C),',')
---------------------------------
4xamnunv51w9j

--sql_id 也可以对上。

时间: 2024-09-20 18:50:57

[20160302]关于FULL_HASH_VALUE.txt的相关文章

[20160302]关于bootstrap$的替换3.txt

[20160302]关于bootstrap$的替换3.txt --前几天写了关于启动时读取bootstrap$的内容.链接如下:http://blog.itpub.net/267265/viewspace-2016219/ --理论将可以自己建立一个新的bootstrap$替换它.自己测试看看. 1.环境: --安全起见,先做一个冷备份. SYS@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ----

[20160302]奇怪的回滚段.txt

[20160302]奇怪的回滚段.txt --昨天在探究oracle的启动时,无意中发现我安装这个版本,在安装的测试样例表空间example出现回滚段. --自己今天仔细看看: 1.环境: SYS@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ----------------------------------

[20160302]绑定变量的分配长度2.txt

[20160302]绑定变量的分配长度2.txt --如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标. --参考连接: http://blog.itpub.net/267265/viewspace-1993495/ --oracle 可以通过一个10503事件设置大的缓存,测试看看: $ oerr ora 10503 10503, 00000, "enable user-specified graduated bind lengths" // *Cause: //

[20171227]表的FULL_HASH_VALUE值的计算.txt

[20171227]表的FULL_HASH_VALUE值的计算.txt --//sql_id的计算是使用MD5算法进行哈希,生成一个128位的Hash Value,其中低32位作为HASH VALUE显示,SQL_ID则取了后64位. --//实际上sql_id使用32进制表示,hash_value使用10进制表示. --//我在链接提到http://blog.itpub.net/267265/viewspace-2142512/内容: --//如果使用md5sum计算的结果,按照4位一组,大小

[20171031]markhot.txt

[20171031]markhot.txt --//昨天看了https://jonathanlewis.wordpress.com/2017/10/02/markhot/,测试看看这样时候可以减少争用. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------------

[20171127]dual.txt

[20171127]dual.txt --//我曾经提到如果在nomount,mount阶段,desc dual,启动到open阶段时,数据库会直接崩溃. --//链接:http://blog.itpub.net/267265/viewspace-1246984/ SYS@test> desc dual ERROR: ORA-04043: object dual does not exist SYS@test> alter database open; alter database open

[20170724]关于sql_id那些事.txt

[20170724]关于sql_id那些事.txt --//昨天别人问的问题,我以前也写过许多blog,做一些总结: http://blog.itpub.net/267265/viewspace-1357292/ http://blog.itpub.net/267265/viewspace-1365382/ http://blog.itpub.net/267265/viewspace-1701985/ 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING      

[20141212]关于sql_id.txt

[20141212]关于sql_id.txt http://blog.itpub.net/267265/viewspace-1357292/ http://blog.itpub.net/267265/viewspace-1220996/ --昨天别人问一些sql_id计算的问题,实际上我也不懂具体的算法,我给他看了上面的链接. --他问的问题,还是通过例子来说明: SCOTT@test> @ver1 PORT_STRING                    VERSION        BA

[20160323]关于FULL_HASH_VALUE2.txt

[20160323]关于FULL_HASH_VALUE2.txt --前一阵子firefox遇到问题,测试插件Calculate Hash.链接: http://blog.itpub.net/267265/viewspace-2023144/ --实际上许多工具命令是相同的,linux下也有一个命令md5sum也可以拿来计算FULL_HASH_VALUE.测试看看: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERS