过去我曾经编写了一个从字符串生成唯一id(数字)的函数。今天我发现它不如想象中那么唯一。以前用它从未出现过问题,但今天两个不同的输入产生了相同的id(数字)。
我在 Delphi、C++、PHP 和 Javascript 中使用相同的技术来生成相同的 id,因此在涉及到不同语言的项目中没有区别。例如,这对于通信、HTML id、临时文件等非常方便。
总体上,我的做法是计算字符串的CRC16,加上总和并返回它。
例如,这两个字符串将生成相同的id(数字):
o.uniqueId( 'M:/Mijn Muziek/Various Artists/Revs & ElBee - Tell It To My Heart.mp3' );
o.uniqueId( 'M:/Mijn Muziek/Various Artists/Dwight Yoakam - The Back Of Your Hand.Mp3');
它们都生成了id为224904。
以下示例是一个JavaScript示例。我的问题是,如何在稍加更改的情况下避免生成重复的id?(如果您想知道'o.'意味着什么,它是这些函数所属对象):
o.getCrc16 = function(s, bSumPos) {
if(typeof s !== 'string' || s.length === 0) {
return 0;
}
var crc = 0xFFFF,
L = s.length,
sum = 0,
x = 0,
j = 0;
for(var i = 0; i < L; i++) {
j = s.charCodeAt(i);
sum += ((i + 1) * j);
x = ((crc >> 8) ^ j) & 0xFF;
x ^= x >> 4;
crc = ((crc << 8) ^ (x << 12) ^ (x << 5) ^ x) & 0xFFFF;
}
return crc + ((bSumPos ? 1 : 0) * sum);
}
o.uniqueId = function(s, bres) {
if(s == undefined || typeof s != 'string') {
if(!o.___uqidc) {
o.___uqidc = 0;
} else {
++o.___uqidc;
}
var od = new Date(),
i = s = od.getTime() + '' + o.___uqidc;
} else {
var i = o.getCrc16(s, true);
}
return((bres) ? 'res:' : '') + (i + (i ? s.length : 0));
};
如何通过对代码进行小改动来避免重复?