JavaScript, 121 bytes, 3268 3250 3244 6354(3185) collisions
s=>{v=i=0;[...s].map(z=>{v=((((v*13)+(s.length-i)*7809064+i*380886)/2)^(z.charCodeAt(0)*266324))&16777215;i++});return v}
Parameters (13, 7809064, 380886, 2, 266324) are by trial and error.
Still optimizable I think, and there is still room for adding extra parameters, working for further optimization...
Verification
hashlist = [];
conflictlist = [];
for (x = 0; x < britain.length; x++) {
hash = h(britain[x]); //britain is the 340725-entry array
hashlist.push(hash);
}
conflict = 0; now_result = -1;
(sortedlist = sort(hashlist)).map(v => {
if (v == now_result) {
conflict++;
conflictlist.push(v);
}
else
now_result = v;
});
console.log(conflictlist);
var k = 0;
while (k < conflictlist.length) {
if (k < conflictlist.length - 1 && conflictlist[k] == conflictlist[k+1])
conflictlist.splice(k,1);
else
k++;
}
console.log(conflict + " " + (conflict+conflictlist.length));
3268 > 3250 - Changed the 3rd parameter from 380713 to 380560.
3250 > 3244 - Changed the 3rd parameter from 380560 to 380886.
3244 > 6354 - Changed the 2nd parameter from 7809143 to 7809064, and found I've used the wrong calculation method ;P