为某些保证唯一的临时上下文生成名称的最佳方式是什么(系统中不能存在具有此名称的上下文)?
发布于 2011-07-29 00:08:16
我可以推荐一个我用过的here函数
Clear[unique];
unique[sym_] :=
ToExpression[
ToString[Unique[sym]] <>
StringReplace[StringJoin[ToString /@ Date[]], "." :> ""]];您可以将ToExpression替换为StringJoin[...,"`"],以根据您的需要对其进行定制。
发布于 2011-07-28 22:54:37
下面的表达式将生成一个上下文名称,该名称保证不会与任何加载的上下文冲突:
First@Contexts[] //.
c_ /; MemberQ[Contexts[], c] :>
"Context"~~ToString[RandomInteger[1000000]]~~"`"它不会尝试说明尚未加载的上下文。正如所写的,此表达式在名称耗尽之前最多可以使用1,000,000次。调整固定字符串("Context")和名称计数(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[], "-" -> ""]~~
"`"发布于 2011-07-29 01:53:34
另一种选择是查看所有起始上下文(在第一个反引号之前),找到它们的字符串长度,然后生成一个至少比其他字符串长一个字符的字符串(可能是随机的,但这不是必须的)。这肯定是独一无二的,而且理论上甚至不会像其他一些解决方案那样发生冲突。
sl = (StringSplit[#, "`"][[1]] & /@ Contexts[] // StringLength // Max )
Out[349]= 30
In[353]:= "c" ~~ ToString[10^sl] ~~ "`"
Out[353]= "c1000000000000000000000000000000`"该方法的缺点是在每次重复应用该方法之后,上下文名称变得更长。;-)如果有问题,我们可以使用Cantor的对角过程基于最长的上下文名称集创建一个唯一的名称。
https://stackoverflow.com/questions/6860391
复制相似问题