我需要从存储在BaseX管理的xml数据库中的元素值生成哈希值。 应用哈希函数,例如。 hash:md5(value)返回字符串:“|¶﹋¥*PܮQፒ|¶﹋¥*PܮQፒ”hash:sha1()返回类似的废话。
我有什么编码设置为utf8 befor? (XML数据库本身采用人类可读的编码方式)
使用BaseX 8.4.4
答案 0 :(得分:3)
使用BaseX 8.4,serialization method "basex"现在用作默认序列化方法。因此,类型为xs:base64Binary和xs:hexBinary的项目现在将以其本机二进制表示形式输出,即使在BaseX GUI中也是如此。
改变输出方法是对旧的" raw"重复讨论的结果。序列化方法,以及关于RESTXQ和其他API的用户反馈,其中人们未能以其本机表示返回二进制数据(例如文件内容)。如果要将二进制数据输出为十六进制或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)
答案 1 :(得分:2)
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表示,再次进行字符串化以防止任何返回二进制形式......
xs:string(hash:md5("hello"))