我正在通过javascript进行一些缓存操作。我有一个方法,它接受一个字符串数组并返回处理后的结果。我想从这些字符串中创建一个唯一的ID,并将其用作对象中存储结果的键。这样,缓存中的键将占用尽可能少的内存。
本质上,我想要类似于SHA1的东西,但是适用于javascript。
您有任何想法如何实现这一点吗?
谢谢。
本质上,我想要类似于SHA1的东西,但是适用于javascript。
您有任何想法如何实现这一点吗?
谢谢。
(将字符串连接的长度作为int) + '/' + (字符串数量作为int) + '/' + (每个字符串的第一个字符)
,根据您的预期值,也可能是可以接受的。最后,这里有一个从C#移植的string.GetHashCode()
实现。如果它对.NET足够好,那么对您来说也可能足够好。
var str = "concatenation of all array values";
var hash1 = (5381<<16) + 5381;
var hash2 = hash1;
var hashPos = 0;
while(hashPos < str.length) {
hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27)) ^ str.charCodeAt(hashPos);
if( hashPos == str.length - 1) {
break;
}
hash2 = ((hash2 << 5) + hash2 + (hash2 >> 27)) ^ str.charCodeAt(hashPos + 1);
hashPos += 2;
}
return hash1 + (hash2 * 1566083941);
如果不使用哈希,你将无法得到独特且小的东西。
使用myArray.join()
可能保证唯一性,但可能会消耗大量内存,并遇到无法保证唯一性的边缘情况。
最好的方法是在JavaScript中使用哈希算法的实现。
myArray.join()
甚至不能保证唯一性。例如,['a', 'b', 'c'].join() === ['a', 'b,c'].join()
。如果字符串符合某些特定格式,那么这可能已经足够了(但像你所说的那样,没有节省空间)。 - Matthew Crumleyvar newDate = new Date;
var uid = newDate.getTime();
或者这样:
var uid = Math.random() * Math.pow(10, 17) + Math.random() * Math.pow(10, 17) + Math.random() * Math.pow(10, 17) + Math.random() * Math.pow(10, 17));
有很多方法可以获得类似唯一标识符的东西,而且由于你正在使用JavaScript进行缓存,所以这变得更加容易。只需要选择最适合你的方法即可。
hash1 + Math.imul(hash2, 1566083941) | 0
,以产生正确的32位输出。 - bryc