如何使用字母a-z生成唯一ID字符

时间:2018-04-21 05:42:34

标签: javascript math random

这是一个小小的挑战,我希望它对其他人也有用。

任务是从英语字母表中获取ID字符。一个到-Z

我的解决方案目前允许26个差异长度(最大可能)的ID(单词)。有90个可能的单词。

我知道如果我们在获得单个字符ID后选择随机字符可以增加(完成。)(但)我发现很难弄清楚如何管理不打击已经找到的组合(ID必须是独特)。正如我们所看到的,如果它开始一遍又一遍地找到相同的组合需要很长时间。随着我们获得越来越多的ID组合,这种可能性会增加。

这是我的代码和小提琴来测试和检查:

fiddle

代码:

HTML

<p>
  start
</p>

jquery的:

 function addto(t) {
    $("p").append("<b>" + t + "</b>");
  }

global_ID_array = [];
lowerAlpha = "abcdefghijklmnopqrstuvwxyz";
var myIDlength = 1;
    function getIDChar (){
        do {
            var myIDchar = lowerAlpha.substr(0, myIDlength);
            lowerAlpha = lowerAlpha.replace(myIDchar,'');
            if (lowerAlpha.length < myIDlength){
                lowerAlpha = "abcdefghijklmnopqrstuvwxyz";      //reset
                myIDlength++;
      }
        } while (global_ID_array.indexOf(myIDchar) > -1)
        global_ID_array.push(myIDchar);
        addto(myIDlength+':'+global_ID_array.length+',');
    }

  do{
  getIDChar();
  }while (myIDlength < 26);
  addto('<br \>myIDlength='+myIDlength);
  addto('<br \>global_ID_array last val='+global_ID_array[global_ID_array.length-1]+'<p>');

1 个答案:

答案 0 :(得分:0)

要开始使用,不要根据字母来考虑ID,而是根据数字来考虑它。

由于有26个可能的字符,因此每个字符可以被视为基数为26的数字系统的数字,a == 0z == 25。问题现在归结为使用字母作为数字生成数字转换为基数为26。由于ID长度为26个字符,因此我们最多可以生成26^26个唯一ID。

现在,为了确保生成的ID是唯一的(最多26^26生成的ID),我们需要找到每次生成唯一编号的方法。最简单的方法是将计数器初始化为0并使用它来生成ID。每次生成ID时,都会递增计数器。当然,这是一种非常确定的生成算法,但您可以使用种子随机数生成器来保证在一个范围内生成的随机数的唯一性。

算法可能如下所示:

n = random(0, 26^26 - 1)

id = "a" * 26
// chars[i] is the character representing the base-26 digit i; 
// you may change/shuffle the list as you please
chars = ['a', 'b', 'c', ..., 'y', 'z']

for i in 0..26 {
    // Get the character corresponding to the next base-26 digit of n (n % 26)
    id[26 - i] = chars[n % 26]
    n /= 26
}