生成不区分大小写、固定长度的唯一字母数字字符串

发布于 2024-07-14 09:39:07 字数 396 浏览 6 评论 0原文

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

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

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

有一个更好的方法吗?

I have searched for an elegant solution, without luck. Ultimately, I need to create a number of unique id's (on a single machine) of a fixed length (of 3 characters) that begin with a letter, and contains only numbers or uppercase letters. (e.g. AXX, where X can be a number or letter)

I am using the mktemp utility to generate the unique ids.
The problem: mktemp creates temporary filenames which are case sensitive.

Currently, I store each temporary file generated in a diretory, "GeneratedFile". I then create a case insensitive version of the file, and store it in a directory, "ExistingID". Each time I call mktemp, I check to see if the generated file has a case insensitive counterpart in the ExistingID directory. If it does, I continue to call mktemp until I generate a filename that isn't currently in use as a unique ID.

Is there a better way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

等风来 2024-07-21 09:39:07

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

You don't mention how unique it has to be - unique on a single machine? On a network? Does it have to have letters? If numbers only is okay then a simple approach might be to use the current system timestamp, as long as you don't need more than one unique string at one particular instance in time. Maybe even run it through md5 to convert it to a fixed-length alphanumeric string.

活雷疯 2024-07-21 09:39:07

这看起来太简单了,

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

更新

一点,这可以在 tr 之后生成非唯一的名称,这是一个很好的选择,但是看看,是否有任何理由需要唯一和随机< /em>? 为什么不直接按字典顺序生成它们呢?

 # 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
  }

This almost seems too easy,

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

Update

The point that this could generate non-unique names after the tr is a good one, but look, is there any reason hey need to be unique and random? Why not just generate them in lexicographic order?

 # 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
  }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文