我需要从存储在BaseX管理的xml数据库中的元素值生成散列。应用散列函数,如.散列:md5(值)返回以下字符串:“ፒ﹋元*pܮqፒ˄ፒ˄﹋﹋*Pܮqፒ˄”散列:sha1 1()也返回类似的废话。
我把任何编码设置成utf8了吗?(XML-数据库本身使用某种人类可读的编码)
使用BaseX 8.4.4
发布于 2016-05-19 16:51:14
每个模块的结果都是在xs:base64Binary中进行的--尽管它将字符串转换为基本数据,但它的核心仍然是二进制数据。
如果要将其转换为十六进制数字的xs:string:
xs:string(xs:hexBinary(hash:md5("hello")))...or,对于hash:md5()返回的默认base64表示形式,再次进行字符串化以防止任何二进制形式的返回.
xs:string(hash:md5("hello"))发布于 2016-05-22 10:02:21
在BaseX 8.4中,序列化方法"basex“现在被用作默认的序列化方法。因此,类型为xs: BaseX 64B和xs:十六进制的项现在将以其本地二进制表示形式输出,甚至在BaseX图形用户界面中也是如此。
更改输出方法是反复讨论旧的“原始”序列化方法的结果,以及用户对RESTXQ和其他API的反馈,在这些API中,人们无法在其本机表示中返回二进制数据(例如文件内容)。如果希望以十六进制或base64的形式输出二进制数据,可以切换到另一个输出方法:
declare option output:method 'text';
hash:md5('abc')正如Charles已经指出的那样,您还可以使用xs:string()或string()查看二进制数据的十六进制或Base64表示。文档中的各种示例已经更新(每个人:请随时为我们的Wiki注册)。
就性能而言,比较二进制数据要比比较字符串表示要快得多。BaseX的散列模块生成xs类型的项:BaseX 64B(类似于处理二进制数据的大多数其他XQuery标准或扩展函数)。但是,XQuery规范不允许直接比较十六进制和Base64,因此可能需要将十六进制转换为Base64或反过来。在BaseX (和大多数其他XQuery实现)中,这非常便宜,因为内部字节表示是相同的。举个例子:
let $hash := '900150983CD24FB0D6963F7D28E17F72'
let $input := 'abc'
return xs:hexBinary(hash:md5($input)) = xs:hexBinary($hash)使用最新的8.4.4快照 of BaseX,可以将节点指定为哈希函数的输入,因此不再需要将元素转换为字符串:
let $hash := '900150983CD24FB0D6963F7D28E17F72'
let $toHashElem := <x>abc</x>
return xs:hexBinary(hash:md5($toHashElem)) = xs:hexBinary($hash)https://stackoverflow.com/questions/37329108
复制相似问题