[英]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)
}
但这会生成像W8M
和YSM
这样的重复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
我的小提琴显示W8N
和YSM
不同结果。 我和你的逻辑是一样的。 看看吧:
let input = "W5M";
let output = '';
for (let i = 0; i < input.length; i++) {
output += input[i].charCodeAt(0);
}
console.log(output);
如果您的最终目标是在创建字符串时创建一个唯一编号,然后可以使用该编号来引用字符串,那么这里有一个单行代码:
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 :
"F".charCodeAt(0) + 100
"o".charCodeAt(0) + 100
"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.