哈希字符串转换成RGB颜色(Hash string into RGB color)

2019-07-30 01:27发布

是否有关于如何散列任意字符串转换为RGB颜色值的最佳做法? 或者更一般的:到3个字节。

你问:当我将永远需要这个? 这并不重要,我,但可以想象的任何GitHub的那些管图形网络页面 。 在那里,你可以看到这样的内容:

如果每个颜色的线是指一个独特的Git分支。 技术含量低的方法来上色这些分支将是一个CLUT(颜色查找表)。 更复杂的版本是:

$branchColor = hashStringToColor(concat($username,$branchname));

因为你想有一个静态的色彩,每次看到树枝表示。 而对于加分:你如何保证哈希函数的色彩分布均匀?

所以,回答我的问题归结为实施hashStringToColor()

Answer 1:

好的哈希函数将提供对密钥空间近似均匀分布。 这降低了问题我怎么一个随机的32位数字转换为3字节的RGB空间。 我认为没有错,只需服用低3个字节。

int hash = string.getHashCode();
int r = (hash & 0xFF0000) >> 16;
int g = (hash & 0x00FF00) >> 8;
int b = hash & 0x0000FF;


Answer 2:

对于任何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格式的十六进制字符串(谢谢!)。



Answer 3:

我想提供所有的解决方案,其他人却发现,类似的字符串(字符串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 。 只需输入一个字符串到输入字段,然后按回车键,这样做一遍又一遍,比较你的发现。



Answer 4:

我只是建立一个名为color散列一个JavaScript库,它可以根据给定的字符串(使用HSL色彩空间和BKDRHash)产生的色彩。

回购: https://github.com/zenozeng/color-hash
演示: https://zenozeng.github.io/color-hash/demo/



Answer 5:

作为一个例子, 这是Java的如何计算字符串的哈希码 (线1494和以下)。 它返回一个int 。 然后就可以计算出的模int与16777216(2 ^ 24 = 3字节),以得到一个“RGB兼容的”号码。

这是一个确定性的计算,因此同一个词(S)将始终具有相同的颜色。 散列冲突的可能性(2串具有相同颜色的)小。 不能确定的颜色分布,但可能是相当随机的。



文章来源: Hash string into RGB color