是否有关于如何散列任意字符串转换为RGB颜色值的最佳做法? 或者更一般的:到3个字节。
你问:当我将永远需要这个? 这并不重要,我,但可以想象的任何GitHub的那些管图形网络页面 。 在那里,你可以看到这样的内容:
如果每个颜色的线是指一个独特的Git分支。 技术含量低的方法来上色这些分支将是一个CLUT(颜色查找表)。 更复杂的版本是:
$branchColor = hashStringToColor(concat($username,$branchname));
因为你想有一个静态的色彩,每次看到树枝表示。 而对于加分:你如何保证哈希函数的色彩分布均匀?
所以,回答我的问题归结为实施hashStringToColor()
好的哈希函数将提供对密钥空间近似均匀分布。 这降低了问题我怎么一个随机的32位数字转换为3字节的RGB空间。 我认为没有错,只需服用低3个字节。
int hash = string.getHashCode();
int r = (hash & 0xFF0000) >> 16;
int g = (hash & 0x00FF00) >> 8;
int b = hash & 0x0000FF;
对于任何JavaScript的用户在那里,我从合并杰夫@福斯特与接受的答案djb2
从哈希函数erlycoder 。
每个问题的结果:
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);
}
更新 :修正了返回的字符串总是返回基于编辑由@alexc一个#000000格式的十六进制字符串(谢谢!)。
我想提供所有的解决方案,其他人却发现,类似的字符串(字符串1 VS字符串2)产生的,我喜欢过类似的颜色。 因此,我建立了自己的输入和别人的思想的影响。
这一个将计算串的MD5校验,并采取前6个十六进制数字来定义RGB 24位代码。
MD5的功能是一个开源的JQuery插上的JS功能发生如下:
function getRGB(str){
var hash = $.md5(str);
var rgb = '#' + hash.substring(0,2) + hash.substring(2,4) + hash.substring(4,6);
return rgb;
}
该工作示例的链接上的jsfiddle 。 只需输入一个字符串到输入字段,然后按回车键,这样做一遍又一遍,比较你的发现。
我只是建立一个名为color散列一个JavaScript库,它可以根据给定的字符串(使用HSL色彩空间和BKDRHash)产生的色彩。
回购: https://github.com/zenozeng/color-hash
演示: https://zenozeng.github.io/color-hash/demo/
作为一个例子, 这是Java的如何计算字符串的哈希码 (线1494和以下)。 它返回一个int
。 然后就可以计算出的模int
与16777216(2 ^ 24 = 3字节),以得到一个“RGB兼容的”号码。
这是一个确定性的计算,因此同一个词(S)将始终具有相同的颜色。 散列冲突的可能性(2串具有相同颜色的)小。 不能确定的颜色分布,但可能是相当随机的。