在过去,我制作了一个从字符串生成唯一 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');
它们都生成 224904 的 id。
以下示例是一个 javascript 示例。我的问题是,我怎样才能避免(稍作改动)它产生重复?(如果您想知道 '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));
};
如何通过对代码稍作改动来避免重复?