假设我有一个字符串var input = "Foo"
,我需要该字符串中的100%唯一编号,我尝试了类似
for (var i = 0, len = input.length; i < len; i++) {
output += input[i].charCodeAt(0)
}
但这会生成重复项W8M
和YSM
,并且都会返回149
的ID。
是否有类似这样的算法?
答案 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;