Javascript根据字符串生成唯一编号

时间:2016-12-04 12:40:58

标签: javascript

假设我有一个字符串var input = "Foo",我需要该字符串中的100%唯一编号,我尝试了类似

for (var i = 0, len = input.length; i < len; i++) {
      output += input[i].charCodeAt(0)
}

但这会生成重复项W8MYSM,并且都会返回149的ID。

是否有类似这样的算法?

4 个答案:

答案 0 :(得分:5)

这个怎么样:

String.prototype.hashCode = function() {
  var hash = 0, i, chr, len;
  if (this.length === 0) return hash;
  for (i = 0, len = this.length; i < len; i++) {
    chr   = this.charCodeAt(i);
    hash  = ((hash << 5) - hash) + chr;
    hash |= 0; // Convert to 32bit integer
  }
  return hash;
};

答案 1 :(得分:2)

我从npm找到了一个名为seedrandom的软件包。

这里是示例用法:

seedrandom("YSM").quick()
// Always 0.25078649865463376
seedrandom("W8M").quick()
// Always 0.6935836656484753

答案 2 :(得分:0)

以下是hash字符串的简单js函数。

function getHash(input){
  var hash = 0, len = input.length;
  for (var i = 0; i < len; i++) {
    hash  = ((hash << 5) - hash) + input.charCodeAt(i);
    hash |= 0; // to 32bit integer
  }
  return hash;
}

console.log(getHash("YSM"));
console.log(getHash("W8M"));

答案 3 :(得分:0)

如果您的最终目标是在创建字符串时创建一个唯一的数字,然后该数字可用于引用该字符串,那么这是紧要关头:

var sUnique = (performance.now()+'').replace('.','');
console.log(sUnique);

与Date接口相比,这将创建更准确的时间戳,如果删除小数点,它将成为一个非常独特的数字。我从未在自己的个人项目中碰到过冲突,可能是因为“与Date.now()不同,performance.now()返回的值始终以恒定的速率增长,而与系统时钟无关”(Source )。但是,如果您仍然偏执,则可以通过执行以下操作来达到更加准独特的效果:

var sVeryUnique = (performance.now()+'').replace('.','') + (Math.random()+'').replace('.','');
console.log(sVeryUnique);

或者这个:

var sVeryUnique = (performance.now()*Math.random() + '').replace('.','');
console.log(sVeryUnique);

如果您需要唯一的数字以始终具有相同的长度,则可以执行以下操作,以确保输出始终包含16位数字:

var sUnique16 = Math.floor(performance.now()*10000000000000) + '';
console.log(sUnique16);

以上所有内容均作为字符串输出。如果需要数字,则转换为数字:

// NOTE: Leading zeroes will be stripped.
var nUnique = +sUnique;