過去,我做了一個函數,它可以從一個字符串生成唯一的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