我试图在 0 和非常低的 n 之间散列一些字符串,以便为每个用户提供一种颜色。
这是我的(工作)代码:
function nameToColor(name) {
var colors = ['red', 'blue', 'green', 'purple', 'orange', 'darkred', 'darkblue', 'darkgreen', 'cadetblue', 'darkpurple'];
var hash = hashStr(name);
var index = hash % colors.length;
return colors[index];
}
//djb2 hash
function hashStr(str) {
var hash = 5381;
for (var i = 0; i < str.length; i++) {
var charCode = str.charCodeAt(i);
hash = ((hash << 5) + hash) + charCode; /* hash * 33 + c */
}
return hash;
}
不幸的是,低数字被大量过度代表。
问题:
如何编写一个确定性的 javascript 函数,该函数将任何字符串作为参数并返回一个良好(尽可能均匀)分布在 0 和 n 之间的数字?