生成不敏感,独特的固定长度字母数字字符串

时间:2009-02-26 16:11:25

标签: string uniqueidentifier case-insensitive alphanumeric

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

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

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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
  }