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

Ale*_*kov 6 wolfram-mathematica

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

WRe*_*ach 9

以下表达式将生成一个上下文名称,保证不会与任何加载的上下文冲突:

First@Contexts[] //.
  c_ /; MemberQ[Contexts[], c] :>
    "Context"~~ToString[RandomInteger[1000000]]~~"`"
Run Code Online (Sandbox Code Playgroud)

它不会尝试考虑尚未加载的上下文.如上所述,在用尽名称之前,此表达式最多可使用1,000,000次.调整固定字符串("上下文")和名称计数(1000000)以适合您的口味.

更新

正如@Leonid在评论中指出的那样,空的上下文不会被列入Contexts[].因此,严格地说,该表达式可能返回现有空上下文的名称.

的UUID

出于所有实际目的,从足够大的范围中随机选择的数字生成名称将起作用,例如

"Context"~~ToString[RandomInteger[2^128]]~~"`"
Run Code Online (Sandbox Code Playgroud)

类似地,可以使用UUID.UUID通常用作标识符,这些标识符在所有网络节点上也非常可能是唯一的:

Needs["JLink`"]
LoadJavaClass["java.util.UUID"]

"Context"~~
  StringReplace[JavaBlock@java`util`UUID`randomUUID[]@toString[], "-" -> ""]~~
  "`"
Run Code Online (Sandbox Code Playgroud)

  • 使用[`$ ModuleNumber`](http://reference.wolfram.com/mathematica/ref/$ModuleNumber.html)而不是随机整数可能更好.这是计数器,在评估时自动递增. (2认同)
  • @Sasha确实可惜.在我的SO评论中,我犯了一些令人尴尬的拼写错误和其他与语法有关的错误,并偶尔碰到这些错误,只是感觉一样. (2认同)
  • @WReach顺便说一句,使用`Contexts []`并不便宜,它需要相当大的时间(在条件`中涉及`MemberQ [Contexts [],...]`的规则特别浪费一般来说,因为`Contexts []`将被重新计算每个潜在的匹配.可以使用`With`来预先计算.虽然这里不是问题,因为规则应用于原子).这是否可接受取决于应用程序. (2认同)

Leo*_*rin 7

我可以建议我在这里使用的函数:

Clear[unique];
unique[sym_] :=
ToExpression[
   ToString[Unique[sym]] <> 
      StringReplace[StringJoin[ToString /@ Date[]], "." :> ""]];
Run Code Online (Sandbox Code Playgroud)

您可以替换 ToExpression通过StringJoin[...,"`"]调整使其适合于您的需求.

  • @Sjoerd我同意理论上的反对意见,但我希望问题不会在实践中发生. (5认同)
  • @Sjoerd好吧,它是微秒,加上它**使用`Unique`,所以你只有几微秒来结束一个会话,启动另一个会话并生成所有以前的唯一索引.似乎*非常*我不太可能:) (2认同)