如何为上下文生成新的唯一名称?

时间:2011-07-28 14:13:24

标签: wolfram-mathematica

为某些保证唯一的临时上下文生成名称的最佳方法是什么(系统中不能存在具有此名称的上下文)?

5 个答案:

答案 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的回复添加了评论,但我不知道如何包含用于表示内联上下文的重音符号。这里有人知道怎么做吗?