为某些保证唯一的临时上下文生成名称的最佳方法是什么(系统中不能存在具有此名称的上下文)?
答案 0 :(得分:9)
以下表达式将生成一个上下文名称,保证不会与任何加载的上下文冲突:
First@Contexts[] //.
c_ /; MemberQ[Contexts[], c] :>
"Context"~~ToString[RandomInteger[1000000]]~~"`"
它不会尝试考虑尚未加载的上下文。如上所述,在用尽名称之前,此表达式最多可使用1,000,000次。调整固定字符串(“上下文”)和名称计数(1000000)以符合您的口味。
更新
正如@Leonid在评论中指出的那样,Contexts[]
中不会列出空的上下文。因此,严格来说,该表达式可能会返回现有空上下文的名称。
<强>的UUID 强>
出于所有实际目的,从足够大的范围中随机选择的数字生成名称将起作用,例如
"Context"~~ToString[RandomInteger[2^128]]~~"`"
以类似的方式,可以使用UUID。 UUID通常用作标识符,这些标识符在所有网络节点上都非常可能是唯一的:
Needs["JLink`"]
LoadJavaClass["java.util.UUID"]
"Context"~~
StringReplace[JavaBlock@java`util`UUID`randomUUID[]@toString[], "-" -> ""]~~
"`"
答案 1 :(得分:7)
我可以建议我使用here的函数:
Clear[unique];
unique[sym_] :=
ToExpression[
ToString[Unique[sym]] <>
StringReplace[StringJoin[ToString /@ Date[]], "." :> ""]];
您可以将ToExpression
替换为StringJoin[...,"`"]
以根据您的需要进行定制。
答案 2 :(得分:2)
另一种选择是查看所有起始上下文(在第一个反引号之前),找到它们的字符串长度,然后生成一个字符串(可能是随机的,但这不是必需的),这个字符串至少比其他字符长一个字符。这保证是独一无二的,并且在某些其他解决方案中甚至没有理论上可能发生冲突。
sl = (StringSplit[#, "`"][[1]] & /@ Contexts[] // StringLength // Max )
Out[349]= 30
In[353]:= "c" ~~ ToString[10^sl] ~~ "`"
Out[353]= "c1000000000000000000000000000000`"
此方法的缺点是每次重复应用此方法后上下文名称会变长。 ;-)如果这是一个问题,我们可以使用Cantor的对角线程序根据最长的上下文名称集创建一个唯一的名称。
答案 3 :(得分:0)
Unique或许你正在寻找什么?
答案 4 :(得分:0)
这是一个例子,说明阿列克谢对Sjoerd的答案/问题的回应。从我机器上的新内核,下面的代码
Begin["myContext3`"];
Unique["myContext"]
产生“myContext3”。因此,显然,Unique
(我想到的第一件事)不起作用。
顺便说一下,我本来只是对Sjoerd的回复添加了评论,但我不知道如何包含用于表示内联上下文的重音符号。这里有人知道怎么做吗?