[20250407]GUID转换GUID_BASE64(补充2).txt --//以前写过一篇GUID转换GUID_BASE64的文章,链接:[20200103]GUID转换GUID_BASE64.txt --//实际上linux直接有一个命令base64直接实现转换.先要转换raw类型再计算,结果完全正确。 --//只不过21c做了小小改动,结尾补充00在做运算。 --//测试我以前写的bash shell脚本就存在一些问题。 1.环境: SYS@book> @ver2 ============================== PORT_STRING : x86_64/Linux 2.4.xx VERSION : 21.0.0.0.0 BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production CON_ID : 0 PL/SQL procedure successfully completed. 2.测试: SYS@book> select CON_ID,DBID,CON_UID,NAME,GUID,GUID_BASE64 from V$CONTAINERs; CON_ID DBID CON_UID NAME GUID GUID_BASE64 ------ ---------- ---------- -------- -------------------------------- ------------------------------ 1 1617337831 1 CDB$ROOT C8209F27C6B16005E053362EE80AE60E yCCfJ8axYAXgUzYu6ArmDgA= 2 2763294012 2763294012 PDB$SEED 1F36DBBBA2C8169BE0636538A8C04D12 Hzbbu6LIFpvgY2U4qMBNEgA= 3 1073777561 1073777561 BOOK01P 1F36F47256D41C08E0636538A8C03260 Hzb0clbUHAjgY2U4qMAyYAA= $ echo -n 1F36F47256D41C08E0636538A8C0326000|xxd -r -p | base64 Hzb0clbUHAjgY2U4qMAyYAA= $ echo -n 1F36DBBBA2C8169BE0636538A8C04D1200|xxd -r -p | base64 Hzbbu6LIFpvgY2U4qMBNEgA= $ echo -n C8209F27C6B16005E053362EE80AE60E00|xxd -r -p | base64 yCCfJ8axYAXgUzYu6ArmDgA= --//完全能对上。注意结尾补充00. --//这样21c的情况利用我当时写的测试脚本计算就存在问题: $ cat o64base.sh #! /bin/bash # convert guid to guid_base64 odebug=${ODEBUG:-0} v2=${1}0 BASE64=($( echo {A..Z} {a..z} {0..9} + / )) res='' for i in $(echo "obase=64;ibase=16; $v2" | bc| tr -d '\\\r\n') do res=${res}${BASE64[$(( 10#$i ))]} done if [ $odebug -eq 1 ] ; then echo v2=$v2 res=$res fi res=${res}== echo $res $ ./o64base.sh 1F36F47256D41C08E0636538A8C03260 Hzb0clbUHAjgY2U4qMAyYA== --//计算还是只能补充1个0,但是结尾出现2个==。这样结尾给修改为A=才是正确的。 --//注:计算还是只能补充1个0,因为这样才能被6整除,(32+1)*4/6 = 22. res=${res}== --//要修改如下才是正确的。 res=${res}A= --//很明显我写的脚本有问题,算法区别在于我写的脚本当作16进制计算,而base64当作字符串。 --//21c的计算结尾补充00 , 这样参数计算的长度等于32+2=34. --//34*4/6 取整 22,取模 34*4%6 = 4,这样要凑够64bits编码,就是补充2bits。并且结尾仅仅需要补充1个=。 --//而18c以前参数计算的长度等于32. --// 32*4/6 取整 21, 32*4%6 = 2,这样要凑够64bits编码(6bits),就是补充4bits,正好相当于补充1个0.并且结尾仅仅需要补充2个=。 --//改用乘法移位操作,补充2bits,相当于16进制的4.而补充4bits,相当于16进制的10. $ cat o64basex.sh #! /bin/bash # convert guid to guid_base64 odebug=${ODEBUG:-0} v2=${1} v3=${2:-4} BASE64=($( echo {A..Z} {a..z} {0..9} + / )) res='' for i in $(echo "obase=64;ibase=16; $v2 * $v3" | bc| tr -d '\\\r\n') do res=${res}${BASE64[$(( 10#$i ))]} done if [ $odebug -eq 1 ] ; then echo v2=$v2 v3=$v3 res=$res fi #res=${res}== echo $res $ o64basex.sh 1F36F47256D41C08E0636538A8C0326000 4 Hzb0clbUHAjgY2U4qMAyYAA --//前面23个字符完全对上。 --//注:我已经加了00,结果后面的pad = 我没有加上。后面的参数2为4实际上是16进制数字。 --//如果参数不添加2个00,可以写成如下,结果也是一样的。 $ ./o64basex.sh 1F36F47256D41C08E0636538A8C03260 4*10*10 Hzb0clbUHAjgY2U4qMAyYAA $ ./o64basex.sh 1F36F47256D41C08E0636538A8C03260 "4*10*10" Hzb0clbUHAjgY2U4qMAyYAA --//后面10(16进制)表示前面参数1输入1个0. --//再测试18c的情况: SYS@192.168.x.y:1521/orclcdb> select banner from v$version; BANNER ---------------------------------------------------------------------- Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production SYS@192.168.x.y:1521/orclcdb> select CON_ID,DBID,CON_UID,NAME,GUID,GUID_BASE64 from V$CONTAINERs; CON_ID DBID CON_UID NAME GUID GUID_BASE64 ------ ---------- ---------- -------- -------------------------------- ------------------------ 1 2756091850 1 CDB$ROOT 64A52F53A7683286E053CDA9E80AED76 ZKUvU6doMobgU82p6Artdg== 2 1474312904 1474312904 PDB$SEED 742DCFA2CE044FDEE0558253DD747177 dC3Pos4ET97gVYJT3XRxdw== 3 115310104 115310104 ORCL 74A69DC145F5662BE0558253DD747177 dKadwUX1ZivgVYJT3XRxdw== $ echo -n 74A69DC145F5662BE0558253DD747177|xxd -r -p | base64 dKadwUX1ZivgVYJT3XRxdw== --//不用补充00,计算完成正确,说明后面的oracle版本做了小小改动,现在21c需要补充\0\0字符参与运算。 $ o64basex.sh 74A69DC145F5662BE0558253DD747177 10 dKadwUX1ZivgVYJT3XRxdw --//前面22个字符完全对上。 --//注意参数2 10是16进制,相当于10进制的16。
[20250407]GUID转换GUID_BASE64(补充2).txt
来源:这里教程网
时间:2026-03-03 21:46:57
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 记一次watchdog引起的Oracle数据库异常
记一次watchdog引起的Oracle数据库异常
26-03-03 - ALTER TABLE SHRINK SPACE及MOVE的区别与适用场景
- oracle中java类的使用
oracle中java类的使用
26-03-03 - oracle加密函数或存储过程代码的两种方式
oracle加密函数或存储过程代码的两种方式
26-03-03 - oracle数据库wrap加密
oracle数据库wrap加密
26-03-03 - Oracle SQL 执行计划分析与优化指南
Oracle SQL 执行计划分析与优化指南
26-03-03 - 古老的Oracle TPCC工具-Hammerora
古老的Oracle TPCC工具-Hammerora
26-03-03 - 记一次防火墙策略设置不当导致连接异常
记一次防火墙策略设置不当导致连接异常
26-03-03 - 19c&21c单机/RAC手工清理标准化文档
19c&21c单机/RAC手工清理标准化文档
26-03-03 - 记一次19C统计信息引发的数据库卡顿问题
记一次19C统计信息引发的数据库卡顿问题
26-03-03
