我需要计算 KDB 中表的
md5
。然而, md5
只能(据我所知)在字符串上调用。那么,如何将 KDB 中的表转换为单个字符串表示形式呢?只要结果是确定性的,它是否是人类可读的并不重要。
tab:flip `items`sales`prices!(`nut`bolt`cam`cog;6 8 0 3;10 20 15 20)
md5 tab / does not work
md5 string tab / does not work
非常感谢您的帮助!
这可以通过
.Q.s1
来实现
md5 .Q.s1 tab
此方法返回 x 的字符串表示形式。
还可以使用
.Q.s
生成表格的纯文本版本,或者使用 .h.jx
生成多行字符串格式,您还可以指定起始行,但 .Q.s1
直接转换为不带换行符的字符串,因此最适合您的目的.
基于字符串的输出根据控制台大小截断,因此在比较整个表时不可靠。
使用
-8!
将表序列化为字节,然后可以转换为字符来运行 md5
:
https://code.kx.com/q/kb/serialization/
q)md5 `char$-8!([] a:1 2 3 )
0xeb5cc58551051573c696ea6f746c0dc8
仍然需要注意的一项是数据属性:
https://code.kx.com/q/ref/set-attribute/
q)md5 `char$-8!([] a:1 2 3 )
0xeb5cc58551051573c696ea6f746c0dc8
q)md5 `char$-8!([] a:`g#1 2 3 )
0xda110d1ca3127bffe0a76ea21574f91d
您可以在列级别删除:
q)md5 `char$-8!{c:cols x;![x;();0b;c!{(#;enlist`;x)}each c]} ([] a:1 2 3 )
0xeb5cc58551051573c696ea6f746c0dc8
q)md5 `char$-8!{c:cols x;![x;();0b;c!{(#;enlist`;x)}each c]} ([] a:`g#1 2 3 )
0xeb5cc58551051573c696ea6f746c0dc8
注意:如果该列包含带有属性的进一步嵌套内容,则需要扩展上述内容。