Jen*_*ohl 46 language-agnostic hash colors
有关如何将任意字符串散列为RGB颜色值的最佳实践吗?或者更一般:3个字节.
你问:我什么时候需要这个?这对我来说无关紧要,但想象一下任何GitHub 网页上的管图.在那里你可以看到这样的东西:

每条彩色线都代表一个独特的git分支.为这些分支着色的低技术方法是CLUT(颜色查找表).更复杂的版本是:
$branchColor = hashStringToColor(concat($username,$branchname));
Run Code Online (Sandbox Code Playgroud)
因为每次看到分支表示时都需要静态颜色.而对于奖励积分:您如何确保该哈希函数的均匀颜色分布?
所以我的问题的答案归结为实施hashStringToColor().
Jef*_*ter 30
良好的散列函数将在密钥空间上提供接近均匀的分布.这减少了如何将随机32位数转换为3字节RGB空间的问题.我认为只需要低3字节就没有错.
int hash = string.getHashCode();
int r = (hash & 0xFF0000) >> 16;
int g = (hash & 0x00FF00) >> 8;
int b = hash & 0x0000FF;
Run Code Online (Sandbox Code Playgroud)
cla*_*mk1 25
对于那里的任何Javascript用户,我将@ jeff-foster的接受答案与erlycoder的djb2哈希函数结合起来.
每个问题的结果:
function djb2(str){
var hash = 5381;
for (var i = 0; i < str.length; i++) {
hash = ((hash << 5) + hash) + str.charCodeAt(i); /* hash * 33 + c */
}
return hash;
}
function hashStringToColor(str) {
var hash = djb2(str);
var r = (hash & 0xFF0000) >> 16;
var g = (hash & 0x00FF00) >> 8;
var b = hash & 0x0000FF;
return "#" + ("0" + r.toString(16)).substr(-2) + ("0" + g.toString(16)).substr(-2) + ("0" + b.toString(16)).substr(-2);
}
Run Code Online (Sandbox Code Playgroud)
更新:修复了返回字符串,以便始终根据@alexc的编辑返回#000000格式的十六进制字符串(谢谢!).
R.J*_*.J. 10
我尝试了其他人提供的所有解决方案,但发现类似的字符串(string1 vs string2)产生的颜色与我的喜好太相似.因此,我建立了自己受其他人的投入和想法的影响.
这个将计算字符串的MD5校验和,并取前6个十六进制数字来定义RGB 24位代码.
MD5功能是一个开源的JQuery插件.JS函数如下:
function getRGB(str) {
return '#' + $.md5(str).substring(0, 6);
}
Run Code Online (Sandbox Code Playgroud)
这个工作示例的链接在jsFiddle上.只需在输入字段中输入一个字符串并按Enter键,然后一遍又一遍地比较您的发现.
我只是构建一个名为color-hash的JavaScript库,它可以根据给定的字符串生成颜色(使用HSL颜色空间和BKDRHash).
回复:https://github.com/zenozeng/color-hash
演示:https://zenozeng.github.io/color-hash/demo/