繁体   English   中英

生成的哈希的BaseX编码

[英]BaseX encoding of generated hashs

我需要从存储在由BaseX管理的xml数据库中的元素值生成哈希。 应用哈希函数,例如 hash:md5(value)返回以下字符串:“ |¶﹋¥* PܮQ ፒ˄ |¶﹋¥* PܮQ ፒ˄” hash:sha1()也返回类似的废话。

我是否已将utf8的编码设置为befor? (XML数据库本身以某种人类可读的编码形式)

使用BaseX 8.4.4

在BaseX 8.4中, 序列化方法“ basex”现在用作默认序列化方法。 结果,xs:base64Binary和xs:hexBinary类型的项目现在将以其本机二进制表示形式输出,即使在BaseX GUI中也是如此。

更改输出方法的原因是反复讨论了旧的“原始”序列化方法,以及有关RESTXQ和其他API的用户反馈,在这些反馈中,人们无法以其本机表示形式返回二进制数据(例如文件内容)。 如果要将二进制数据输出为十六进制或base64,则可以切换到另一种输出方法:

declare option output:method 'text';
hash:md5('abc')

正如Charles Duffy已经指出的那样,您还可以使用xs:string()string()来查看二进制数据的十六进制或Base64表示形式。 文档中的各种示例已更新(每个人:随时注册我们的Wiki!)。

在性能方面,比较二进制数据比比较字符串表示要快得多。 开箱即用的BaseX散列模块生成xs:base64Binary类型的项目(类似于处理二进制数据的XQuery的大多数其他标准或扩展功能)。 但是,XQuery规范不允许您直接比较十六进制和Base64,因此您可能需要将十六进制转换为Base64或以其他方式转换。 在BaseX(和大多数其他XQuery实现)中,这非常便宜,因为内部字节表示形式是相同的。 一个例子:

let $hash := '900150983CD24FB0D6963F7D28E17F72'
let $input := 'abc'
return xs:hexBinary(hash:md5($input)) = xs:hexBinary($hash)

使用最新的8.4.4 BaseX 快照 ,可以将节点指定为哈希函数的输入,因此不再需要将元素强制转换为字符串:

let $hash := '900150983CD24FB0D6963F7D28E17F72'
let $toHashElem := <x>abc</x>
return xs:hexBinary(hash:md5($toHashElem)) = xs:hexBinary($hash)

根据basex hash模块的显式文档 ,结果位于xs:base64Binary -虽然它以base-64数据形式转换为字符串,但其核心仍是二进制的。

如果要将其xs:string为十六进制数字的xs:string

xs:string(xs:hexBinary(hash:md5("hello")))

...或者,对于hash:md5()返回的默认base64表示形式,再次进行字符串化处理以防止任何返回二进制形式...

xs:string(hash:md5("hello"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM