首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为context生成新的唯一名称?

如何为context生成新的唯一名称?
EN

Stack Overflow用户
提问于 2011-07-28 22:13:24
回答 5查看 424关注 0票数 6

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-29 00:08:16

我可以推荐一个我用过的here函数

代码语言:javascript
运行
复制
Clear[unique];
unique[sym_] :=
ToExpression[
   ToString[Unique[sym]] <> 
      StringReplace[StringJoin[ToString /@ Date[]], "." :> ""]];

您可以将ToExpression替换为StringJoin[...,"`"],以根据您的需要对其进行定制。

票数 7
EN

Stack Overflow用户

发布于 2011-07-28 22:54:37

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

代码语言:javascript
运行
复制
First@Contexts[] //.
  c_ /; MemberQ[Contexts[], c] :>
    "Context"~~ToString[RandomInteger[1000000]]~~"`"

它不会尝试说明尚未加载的上下文。正如所写的,此表达式在名称耗尽之前最多可以使用1,000,000次。调整固定字符串("Context")和名称计数(1000000)以满足您的口味。

更新

正如@Leonid在评论中指出的那样,Contexts[]中不会列出空的上下文。因此,严格来说,这个表达式可以返回现有空上下文的名称。

UUID

对于所有实际目的,从一个从足够大的范围中随机选择的数字生成一个名称将是可行的,例如

代码语言:javascript
运行
复制
"Context"~~ToString[RandomInteger[2^128]]~~"`"

与此类似,我们也可以使用UUID。UUID通常用作标识符,这些标识符在所有网络节点中也很可能是唯一的:

代码语言:javascript
运行
复制
Needs["JLink`"]
LoadJavaClass["java.util.UUID"]

"Context"~~
  StringReplace[JavaBlock@java`util`UUID`randomUUID[]@toString[], "-" -> ""]~~
  "`"
票数 9
EN

Stack Overflow用户

发布于 2011-07-29 01:53:34

另一种选择是查看所有起始上下文(在第一个反引号之前),找到它们的字符串长度,然后生成一个至少比其他字符串长一个字符的字符串(可能是随机的,但这不是必须的)。这肯定是独一无二的,而且理论上甚至不会像其他一些解决方案那样发生冲突。

代码语言:javascript
运行
复制
sl = (StringSplit[#, "`"][[1]] & /@ Contexts[] // StringLength // Max )

Out[349]= 30

In[353]:= "c" ~~ ToString[10^sl] ~~ "`"

Out[353]= "c1000000000000000000000000000000`"

该方法的缺点是在每次重复应用该方法之后,上下文名称变得更长。;-)如果有问题,我们可以使用Cantor的对角过程基于最长的上下文名称集创建一个唯一的名称。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6860391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档