我正在尝试使用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模式。在这种情况下,您必须通过添加密钥使用HMAC变体:xdmp:hex-to-integer(xdmp:hmac-sha512('s3cr!t', 'fubar'))
=> 18446744073709551615
对于等效的Java代码,SHA2 password hashing in java可能会有所帮助。只要双方都使用相同的算法和密钥,就可以了。
请注意,对Java使用无符号64位长整数可能不是理想的选择,因为Java没有将无符号64位长作为原始类型。我了解JDK8提供了一些帮助。但是,比较十六进制字符串可能与其他任何解决方案一样简单有效。