繁体   English   中英

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

[英]Javascript generate unique number based on string

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

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

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

有这样的算法吗?

你想要一个哈希函数。 散列函数通常不是唯一的(因为存在冲突),但是键空间非常庞大,以至于您可能一生都没有在应用程序中找到它。

首先寻找 JavaScript 的 SHA1 和 SHA256 实现,如果您使用的是 node,请查看crypto 模块

这个怎么样:

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

这是一个简单的js字符串hash函数。

 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"));

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

这是它的示例用法:

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

我的小提琴显示W8NYSM不同结果。 我和你的逻辑是一样的。 看看吧:

let input = "W5M";
let output = '';
for (let i = 0; i < input.length; i++) {
    output += input[i].charCodeAt(0);
}

console.log(output);

https://jsfiddle.net/3fqsvkqw/4/

如果您的最终目标是在创建字符串时创建一个唯一编号,然后可以使用该编号来引用字符串,那么这里有一个单行代码:

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

这将创建一个比 Date 接口更准确的时间戳,如果您删除小数点,它将成为一个非常独特的数字。 我从来没有在我的个人项目的碰撞,很可能是因为“不像Date.now()返回的值performance.now()总是增加以恒定的速率,独立于系统时钟”( 来源)。 但是,如果你仍然偏执,你可以通过做这样的事情来实现更准独特的东西:

 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;

是的,这是产生大量唯一数字的一种方法:

将每个字符映射到一个 * customCode ,然后将该数字与下一个 customCode 连接起来。

* customCode是一个代表 charCode 的数字,它的所有值都有一个特定的数字长度。

如果我们正在处理8 位字符串( charCode从 1 到 255,位数长度从 1 到 3 不等),我们需要将 100 添加到每个 charCode 以获得从 101 到 355 的值,以便位数长度所有可能的值都相同。

在上述情况下(8位字符串),我们的唯一编号每个字符有3 位数字,这意味着对于“ Foo ”,我们将有170211211

  • 170: "F".charCodeAt(0) + 100
  • 211: "o".charCodeAt(0) + 100
  • 211: "o".charCodeAt(0) + 100

对于所有可能的 Javascript 字符串,由于charCode 的范围可以从 1 到 65536,我们需要所有charCode值的 5 位数字,而“ F ” 将为10070"F".charCodeAt(0) + 10000

const uniqueNumberFromString = ( str, utf16 = false ) => {
  let results = ""
  const fixedNumber = utf16 ? 10000 : 100
  for (let i = 0; i < str.length; i++) {
    results += (fixedNumber + str[i].charCodeAt(0)).toString()
  }
  return parseInt(results)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM