我正在尝试使用XQuery和Java生成相同的64位整数。
当前,我正在使用XQuery(MarkLogic)并使用xdmp:hash64函数生成64位数字。

例如,xdmp:hash64('123')将给我们6570863421667228143

现在我想用Java生成相同的东西。我想知道是否有人可以提供一些见解

谢谢

最佳答案

xdmp:hash64算法是专有算法,并且属性未知。您可以将Java的所有输入发送到MarkLogic,以询问哈希是什么。但是我会寻找在两种环境中都可用的哈希算法。

根据您的需求,SHA-2可能是合适的选择:https://docs.marklogic.com/xdmp:sha512xdmp:sha384xdmp:sha256

您要求输入一个xdmp:hash64这样的64位数字,它产生:64位无符号长型。 SHA-2函数返回十六进制或base64字符串,但十六进制易于使用:

xdmp:hex-to-integer(xdmp:sha512('fubar'))


如果抛出XDMP-FIPSWEAKHASH,则您的群集处于FIPS模式。在这种情况下,您必须通过添加密钥使用HMAC变体:

xdmp:hex-to-integer(xdmp:hmac-sha512('s3cr!t', 'fubar'))
=> 18446744073709551615


对于等效的Java代码,SHA2 password hashing in java可能会有所帮助。只要双方都使用相同的算法和密钥,就可以了。

请注意,对Java使用无符号64位长整数可能不是理想的选择,因为Java没有将无符号64位长作为原始类型。我了解JDK8提供了一些帮助。但是,比较十六进制字符串可能与其他任何解决方案一样简单有效。

08-05 08:00