[20251221]建立s2h.sh脚本.txt
--//建立一个简单的sql_id 转换 hash_value 值的bash shell脚本。
--//没有直接采用 v2=$[ 32#$v1 % 2**32 ] 计算hash_value ,主要原因bash shell计算可能出现负数,取sql_id的后8位,相当于二进
--//制8*5 = 40 bit,而hash_value是使用4*8 =32bit来计算,不会出现问题,也规避出现负数的情况。
$ cat s2h.sh
#! /bin/bash
# convert sql_id to hash_value hash_value_hex kgl_bucket kgl_bucket_hex
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 ' '))
v2s=${v1:(-8):8}
v2=$[ 32#$v2s % 2**32 ]
if [ $odebug -eq 1 ] ; then
echo "sql_id=$sql_id v1=$v1 v2=$v2"
fi
v2x=$(printf "0x%x" $v2)
v3=$[ v2 % 2**17 ]
v3x=$(printf "0x%x" $v3)
echo
echo "sql_id=$sql_id hash_value=$v2 hash_value_hex=$v2x kgl_bucket=$v3 kgl_bucket_hex=$v3x"
echo
#echo "sql_id = $sql_id hash_value = $(( 32#$(echo $sql_id | tr $(echo {0..9} {a..z} | tr -d 'eilo ') $( echo {0..9} {a..v}| tr -d ' ')) % 2**32 ))"
--//对比测试结果:
--//简单测试如下:
SCOTT@book01p> select * from dept where deptno=50;
no rows selected
SCOTT@book01p> @ hashz
HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET HASH_HEX SQL_EXEC_START SQL_EXEC_ID
----------- ------------- ------------ ---------- ---------- ------------------- -----------
1927948053 bswp9zttfn9sp 0 10005 72ea2715 2025-12-21 10:43:08 16777219
SCOTT@book01p> @ s2h bswp9zttfn9sp
SQL_ID HASH_VALUE HASH_HEX KGL_BUCKET KGL_BUCKET_HEX
------------- ----------- ---------- ---------- --------------
bswp9zttfn9sp 1927948053 72ea2715 10005 0x2715
$ . s2h.sh bswp9zttfn9sp
sql_id=bswp9zttfn9sp hash_value=1927948053 hash_value_hex=0x72ea2715 kgl_bucket=10005 kgl_bucket_hex=0x2715
--//对比测试结果正确。