ユーザーごとに 1 つの色を与えるために、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;
}
残念ながら、低い数値は非常に過剰に表現されています。
質問:
任意の文字列を引数として取り、0 から n までの数値を適切な (できるだけ均一な) 分布で返す決定論的な JavaScript 関数を作成するにはどうすればよいですか?