[20251221]建立s2h.sh脚本.txt

[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

--//对比测试结果正确。

请使用浏览器的分享功能分享到微信等