过去,我做了一个函数,它可以从一个字符串生成唯一的id(数字)。今天我发现它并不像应该那样独特。之前从来没有看到过问题。今天两个不同的输入产生相同的id(数字)。根据Javascript中的字符串输入生成唯一编号
我在Delphi,C++,PHP和Javascript中使用相同的技术来生成相同的ID,所以当不同的语言涉及到项目时没有区别。例如,这可以方便沟通,为HTML标识,临时文件等
一般来说,我所做的是计算一个字符串的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));
};
我怎样才能避免在使用一点点改变代码的副本?
如果您将长字符串“哈希”为短ID,[您可能在某一天遇到碰撞](http://en.wikipedia.org/wiki/Pigeonhole_principle)。 – Passerby 2013-03-13 04:38:53