【问题标题】:Alpha-numeric string without 'o' character不带“o”字符的字母数字字符串
【发布时间】:2017-10-03 15:10:38
【问题描述】:

我在 Java 中有一个正长整数。基于这个数字,我想生成一个唯一的字母数字(不区分大小写)字符串。我的要求之一是不要使用字母 o。

我正在考虑做这样的事情:

String uniqueString = Long.toString(id, 35);
uniqueString = uniqueString.replace('o', 'z');
uniqueString = uniqueString.toUpperCase();

其中 id 是前面提到的长整数。

我对 2 个不同的 id 总是会生成不同的 uniqueStrings 是对的吗?

【问题讨论】:

  • 是的,你是对的。
  • 只要“id”是唯一的,你的“随机”ID就不会有'o',但是你的随机数会比随机分布有更多的z。考虑用随机的非“o”值替换每个“o”。
  • 使用基数 36 而不是 35。26 个字母 + 10 个数字(0 到 9)= 36。
  • 您不确定是否拥有唯一的密钥。例如,如果 1 被 z1 替换,2 被 o1 替换,如果你用 z 替换 o,你的两个数字 1 和 2 将具有相同的代码 z1
  • @FrançoisLEPORCQ 和 JustinKSU 你们都误解了这里发生的事情。基数 35 表示 0-9 和 a-y。基数 36 将包括 z。分布没有倾斜,因为 o 被替换为未使用的字符。

标签: java string unique alphanumeric


【解决方案1】:

根据 cmets,这并没有我想象的那么明显,所以我想我会发布一个答案。

Long.toString(long i, int radix) 可以表示Character.MIN_RADIXCharacter.MAX_RADIX 之间的基数,分别等于2 和36。它使用以下符号作为数字:

0123456789abcdefghijklmnopqrstuvwxyz

当您使用 String uniqueString = Long.toString(id, 35); 时,您使用的是基数 35 以及除字母 z 之外的所有符号,当然,只要 id 是唯一的,它在不同的基数中也将是唯一的。

稍后您将o 替换为z,这当然不会改变任何内容,并且不会导致您拥有比一条评论中提到的随机分布更多的z,您只是替换一个符号与另一个符号(数字 might not be randomly distributed 取决于 id 代表什么,但这是一个不同的主题)。

您没有问,但这是一个很好的解决方案,唯一的低效是最初使用 o,然后用 z 代替它,而不是使用 z 而不是 o 作为数字之一,但这是不重要,为了做到这一点而自己实现它将是一个过早的优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多