【问题标题】:Generating Case Insensitive, Unique Alphanumeric Strings of Fixed Length生成不区分大小写的唯一固定长度字母数字字符串
【发布时间】:2009-02-26 16:11:25
【问题描述】:

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

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

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

有没有更好的方法来做到这一点?

【问题讨论】:

  • 我认为你的意思是“优雅”顺便说一句,副“雄辩”。 “口才”的意思是“有说服力,口才好”。

标签: string uniqueidentifier case-insensitive alphanumeric


【解决方案1】:

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

【讨论】:

  • 在单台机器上是唯一的。它必须以字母开头。
  • 那么固定字母(“A”)后跟时间戳怎么样?你没有提到这是什么语言 - Java? Bash 脚本?
  • 这是一个 Bash 脚本。时间戳会生成两个字符的结果吗?
  • 是的,这就是我的假设,也是我没有使用系统时间戳的原因。
【解决方案2】:

这似乎太容易了,

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
  }

【讨论】:

  • 这个问题是,下次我调用 mktemp 时它可能会生成一个副本。例如。它生成ACa,然后下一次生成AcA。 mktemp 认为它产生了一个新的、独特的结果。但是因为我需要全部大写字母 (ACA),所以它们对于我的规范来说是相同的结果。
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 2011-08-23
  • 2016-07-12
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
相关资源
最近更新 更多