生成的哈希值的 BaseX 编码
BaseX encoding of generated hashs
我需要从存储在由 BaseX 管理的 xml 数据库中的元素值生成散列。
应用哈希函数,例如。 hash:md5(value) 返回以下字符串:“|¶﹋¥*P﹋Qፒ˄|¶﹋¥*P﹤Qፒ˄” hash:sha1() 也返回类似的废话。
我之前有没有把whatever-encoding设置成utf8? (XML-数据库本身采用某种人类可读的编码)
使用 BaseX 8.4.4
Per the explicit documentation for the basex hash
module,结果在 xs:base64Binary
中——虽然它转换为字符串作为 base-64 数据,但其核心仍然是二进制的。
如果您想将其转换为 xs:string
个十六进制数字:
xs:string(xs:hexBinary(hash:md5("hello")))
...或者,对于由 hash:md5()
编辑的默认 base64 表示 return,再次进行字符串化以防止任何 return 变为二进制形式...
xs:string(hash:md5("hello"))
对于 BaseX 8.4,serialization method "basex" 现在用作默认序列化方法。因此,xs:base64Binary 和 xs:hexBinary 类型的项目现在将以其本机二进制表示形式输出,即使在 BaseX GUI 中也是如此。
更改输出方法是对旧 "raw" 序列化方法反复讨论的结果,以及用户对 RESTXQ 和其他 API 的反馈,人们未能 return 二进制数据(例如文件内容) 在其原生表示中。如果你想将二进制数据输出为hex或base64,你可以切换到另一种输出方式:
declare option output:method 'text';
hash:md5('abc')
正如 Charles Duffy 已经指出的,您还可以使用 xs:string()
或 string()
来查看二进制数据的十六进制或 Base64 表示形式。文档中的各种示例已更新(每个人:请随时注册我们的 Wiki!)。
就性能而言,比较二进制数据比比较字符串表示要快得多。 BaseX 的散列模块生成开箱即用的 xs:base64Binary 类型的项目(类似于大多数其他处理二进制数据的 XQuery 标准或扩展函数)。但是,XQuery 规范不允许您直接比较 hex 和 Base64,因此您可能需要将 hex 转换为 Base64 或相反。在 BaseX(和大多数其他 XQuery 实现)中,这是非常便宜的,因为内部字节表示是相同的。一个例子:
let $hash := '900150983CD24FB0D6963F7D28E17F72'
let $input := 'abc'
return xs:hexBinary(hash:md5($input)) = xs:hexBinary($hash)
使用最新的 8.4.4 snapshot BaseX,可以将节点指定为哈希函数的输入,因此不再需要将元素转换为字符串:
let $hash := '900150983CD24FB0D6963F7D28E17F72'
let $toHashElem := <x>abc</x>
return xs:hexBinary(hash:md5($toHashElem)) = xs:hexBinary($hash)
我需要从存储在由 BaseX 管理的 xml 数据库中的元素值生成散列。 应用哈希函数,例如。 hash:md5(value) 返回以下字符串:“|¶﹋¥*P﹋Qፒ˄|¶﹋¥*P﹤Qፒ˄” hash:sha1() 也返回类似的废话。
我之前有没有把whatever-encoding设置成utf8? (XML-数据库本身采用某种人类可读的编码)
使用 BaseX 8.4.4
Per the explicit documentation for the basex hash
module,结果在 xs:base64Binary
中——虽然它转换为字符串作为 base-64 数据,但其核心仍然是二进制的。
如果您想将其转换为 xs:string
个十六进制数字:
xs:string(xs:hexBinary(hash:md5("hello")))
...或者,对于由 hash:md5()
编辑的默认 base64 表示 return,再次进行字符串化以防止任何 return 变为二进制形式...
xs:string(hash:md5("hello"))
对于 BaseX 8.4,serialization method "basex" 现在用作默认序列化方法。因此,xs:base64Binary 和 xs:hexBinary 类型的项目现在将以其本机二进制表示形式输出,即使在 BaseX GUI 中也是如此。
更改输出方法是对旧 "raw" 序列化方法反复讨论的结果,以及用户对 RESTXQ 和其他 API 的反馈,人们未能 return 二进制数据(例如文件内容) 在其原生表示中。如果你想将二进制数据输出为hex或base64,你可以切换到另一种输出方式:
declare option output:method 'text';
hash:md5('abc')
正如 Charles Duffy 已经指出的,您还可以使用 xs:string()
或 string()
来查看二进制数据的十六进制或 Base64 表示形式。文档中的各种示例已更新(每个人:请随时注册我们的 Wiki!)。
就性能而言,比较二进制数据比比较字符串表示要快得多。 BaseX 的散列模块生成开箱即用的 xs:base64Binary 类型的项目(类似于大多数其他处理二进制数据的 XQuery 标准或扩展函数)。但是,XQuery 规范不允许您直接比较 hex 和 Base64,因此您可能需要将 hex 转换为 Base64 或相反。在 BaseX(和大多数其他 XQuery 实现)中,这是非常便宜的,因为内部字节表示是相同的。一个例子:
let $hash := '900150983CD24FB0D6963F7D28E17F72'
let $input := 'abc'
return xs:hexBinary(hash:md5($input)) = xs:hexBinary($hash)
使用最新的 8.4.4 snapshot BaseX,可以将节点指定为哈希函数的输入,因此不再需要将元素转换为字符串:
let $hash := '900150983CD24FB0D6963F7D28E17F72'
let $toHashElem := <x>abc</x>
return xs:hexBinary(hash:md5($toHashElem)) = xs:hexBinary($hash)