我正在尝试使用 XQuery 和 Java 生成相同的 64 位整数。
目前,我正在使用 XQuery (MarkLogic) 并使用 xdmp:hash64
生成 64 位数字的函数。
例如,xdmp:hash64('123')
将为我们提供 6570863421667228143
。
现在我想用 Java 生成相同的内容。我想知道是否有人可以提供一些见解
谢谢
最佳答案
xdmp:hash64 算法是专有的,具有未知的属性。您可以将每个输入从 Java 发送到 MarkLogic,询问它哈希是什么。但我会寻找一种在两种环境中都可用的哈希算法。
根据您的需要,SHA-2 可能是合适的选择:https://docs.marklogic.com/xdmp:sha512或 xdmp:sha384
或 xdmp:sha256
。
您要求像 xdmp:hash64
这样的 64 位数字产生:64 位无符号长整数。 SHA-2 函数返回十六进制或 base64 字符串,但十六进制很容易处理:
xdmp:hex-to-integer(xdmp:sha512('fubar'))
如果抛出 XDMP-FIPSWEAKHASH
,那么您的集群处于 FIPS 模式。在这种情况下,您必须通过添加 key 来使用 HMAC 变体:
xdmp:hex-to-integer(xdmp:hmac-sha512('s3cr!t', 'fubar'))
=> 18446744073709551615
对于等效的 Java 代码 SHA2 password hashing in java可能有帮助。只要您在两侧使用相同的算法和 key ,就可以了。
请注意,使用无符号 64 位长整型可能不适合 Java,因为 Java 没有将无符号 64 位长整型作为基本类型。我知道 JDK8 提供了一些帮助。但是,比较十六进制字符串可能会像其他任何解决方案一样简单高效。
关于java - xdmp :hash64 equivalent in Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25457943/