使用Marklogic(XQuery)中的时间戳生成非重复随机数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Marklogic(XQuery)中的时间戳生成非重复随机数?相关的知识,希望对你有一定的参考价值。

我想生成带有时间戳的非重复随机数。可能的代码是什么?

我已经尝试过使用sem:uuid-string()函数,但它会生成36个很长的字符。

答案

我建议看看ml-unique库。它提供了3种不同的方法来生成MarkLogic中的唯一ID,并解释了每种方法的优缺点。也许其中一个符合您的需求,或者您可以复制代码,并根据需要进行调整。

请注意,仅时间戳不足以保证唯一性,特别是在一个请求中生成多个ID或并行处理数据时。

顺便说一句,uuid弦的长度使碰撞的机会非常小。

HTH!

另一答案

不可能生成非重复随机数并且结果适合有限大小。如果36个字节太大,进一步限制了理论最大值。服务器本身使用64位随机数(有效xdmp:random)作为唯一ID。尝试在碰撞概率方面做得更好是徒劳的 - 无论您使用什么URI或多长时间,内部引用都将被创建为64位随机数或哈希值。推荐的方法不会产生有效碰撞的URI,但概率较小,服务器本身将给出任何大小的非碰撞URI。由于伪随机数算法的巧妙性,最有可能尝试更复杂的“随机”URI生成将导致更糟糕的结果。

另一答案

下面的代码生成(具有任意高概率)10个不同的随机数。 for循环的每次迭代都会将新生成的随机数插入MarkLogic数据库。当已生成10个不同的数字时,将抛出异常错误((),'BREAK')。

xquery version "1.0-ml";
xdmp:document-insert("/doc/random.xml",<root><a>xdmp:random(100)</a></root>);
try 
for $i in (1 to 200) (:200 can be replace with larger number to reduce probability that 10 different random numbers will never be selected.:)
return    xdmp:invoke-function( function() as item()? 
 let $myrandom:= xdmp:random(100), $last:=  count(doc("/doc/random.xml")/root/*)
return
if ($last lt 10) then (
if (doc("/doc/random.xml")/root/a/text() = $myrandom) then () else (xdmp:node-insert-after(doc("/doc/random.xml")/root/a[last()], <a>$myrandom</a>)))
else (if ($last eq 10) then (error((), 'BREAK')) else ()),
<options xmlns="xdmp:eval">
  <transaction-mode>update</transaction-mode>
  <transaction-mode>update-auto-commit</transaction-mode>
</options>)
catch ($ex) 
if ($ex/error:code eq 'BREAK') then ("10 different random numbers were generated") else xdmp:rethrow() ;

以上是关于使用Marklogic(XQuery)中的时间戳生成非重复随机数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 XQuery 从查询控制台读取 MarkLogic 日志

Marklogic Json Xquery 无法查询

在 MarkLogic 中使用 XSLT/XQUERY 进行转换?

我可以在 Marklogic Server 的 xquery 中声明一个全局变量吗?

通过 XCC 将 XQuery xml 元素作为外部变量传递给 Marklogic

在不同于使用 XQuery 处理的数据库上进行查询