0

我一直在寻找一个优雅的解决方案,但没有运气。最终,我需要创建多个以字母开头且仅包含数字或大写字母的固定长度(3 个字符)的唯一 ID(在单台机器上)。(例如 AXX,其中 X 可以是数字或字母)

我正在使用 mktemp 实用程序来生成唯一 ID。问题:mktemp 创建了区分大小写的临时文件名。

目前,我将生成的每个临时文件存储在一个目录“GeneratedFile”中。然后我创建一个不区分大小写的文件版本,并将它存储在一个目录“ExistingID”中。每次调用 mktemp 时,我都会检查生成的文件是否在 ExistingID 目录中有不区分大小写的对应文件。如果是这样,我将继续调用 mktemp,直到生成一个当前未用作唯一 ID 的文件名。

有一个更好的方法吗?

4

2 回答 2

0

你没有提到它必须是多么独特——在一台机器上是独一无二的?在网络上?一定要有字母吗?如果仅数字是可以的,那么一种简单的方法可能是使用当前系统时间戳,只要您在一个特定实例的时间不需要多个唯一字符串即可。甚至可能通过 md5 运行它以将其转换为固定长度的字母数字字符串。

于 2009-02-26T16:16:26.040 回答
0

这似乎太容易了,

mktemp AXX | tr 'a-z' 'A-Z'

更新

这可能会在 之后生成非唯一名称tr是一个很好的问题,但是看,有什么理由需要唯一和随机的吗?为什么不按字典顺序生成它们?

 # pseudobash, untested
 digit1=0
 digit2=0
 chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 function nextName {
      str= "A" chars[digit2] chars[digit1]
      ((digit1++))
      if digit1 > 35
      then
          ((digit2++))
          digit1=0
      fi
      return str
  }
于 2009-02-26T16:40:19.820 回答