如何将字符串转换为 html 颜色代码哈希?

Posted

技术标签:

【中文标题】如何将字符串转换为 html 颜色代码哈希?【英文标题】:How can I convert strings to an html color code hash? 【发布时间】:2011-04-13 01:16:14 【问题描述】:

我想将字符串表示为任意 html 颜色。

例子:

“废话”=#FFCC00 "foo foo 2" = #565656

实际的颜色代码是什么并不重要,只要它是有效的十六进制 HTML 颜色代码并且整个光谱都可以很好地表示。

我猜第一步是对字符串做一个 MD5,然后以某种方式将其转换为十六进制颜色代码?

更新: 使用示例是生成服务器上文件请求的可视化报告。颜色不必看起来很漂亮,更重要的是人脑可以更容易地检测数据中的模式等。

【问题讨论】:

是否要将字符串映射到 6 位十六进制代码? 你能举例说明你将如何使用这些字符串吗?为什么不把颜色代码放在 php 变量中? 遵循 codaddict 的想法:散列并取前 6 个字节? 使用示例是在服务器上生成文件请求的可视化报告。颜色不必看起来很漂亮,更重要的是人脑可以更容易地检测数据中的模式等。 那么根据文件请求的数量,你想给文件名一个不同的颜色吗?在php中? 【参考方案1】:

几乎总是,只使用随机颜色会

    看起来很糟糕 与背景冲突

我建议创建一个(较长的)颜色列表,这些颜色可以很好地与您的背景一起使用 - 然后只需将字符串和模数 (%) 与您的颜色数量进行散列,以获得表格中的索引。

public function colorFromString($string)

  $colors = [
    '#0074D9',
    '#7FDBFF',
    '#39CCCC',
    // this list should be as long as practical to avoid duplicates
  ];

  // generate a partial hash of the string (a full hash is too long for the % operator)
  $hash = substr(sha1($string), 0, 10);

  // determine the color index
  $colorIndex = hexdec($hash) % count($colors);

  return $colors[$colorIndex];

【讨论】:

这是最好的答案。您应该包含一个功能以使其完整。【参考方案2】:

我同意上述 sje397 的观点,即完全随机的颜色最终会看起来很糟糕。与其列出一长串好看的颜色,我建议选择一个恒定的饱和度+发光值,并根据内容改变色调。要从 HSL 颜色中获取 RGB 颜色,您可以使用类似于 http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB 中描述的内容。

这是一个示例(在 http://codepad.viper-7.com 中尝试一些可行的方法,例如 https://codepad.remoteinterview.io/ZXBMZWYJFO):

<?php

function hsl2rgb($H, $S, $V) 
    $H *= 6;
    $h = intval($H);
    $H -= $h;
    $V *= 255;
    $m = $V*(1 - $S);
    $x = $V*(1 - $S*(1-$H));
    $y = $V*(1 - $S*$H);
    $a = [[$V, $x, $m], [$y, $V, $m],
          [$m, $V, $x], [$m, $y, $V],
          [$x, $m, $V], [$V, $m, $y]][$h];
    return sprintf("#%02X%02X%02X", $a[0], $a[1], $a[2]);


function hue($tstr) 
    return unpack('L', hash('adler32', $tstr, true))[1];


$phrase = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
$words = [];
foreach (explode(' ', $phrase) as $word)
    $words[hue($word)] = $word;
ksort($words);
foreach ($words as $h => $word) 
    $col = hsl2rgb($h/0xFFFFFFFF, 0.4, 1);
    printf('<span style="color:%s">%s</span> ', $col, $word);

?>

【讨论】:

PHP 解析错误:语法错误,$a 后出现意外的 '[',因为 PHP 版本较旧。 这将解决解析问题:$a = [[$V, $x, $m], [$y, $V, $m], [$m, $V, $x ], [$m, $y, $V], [$x, $m, $V], [$V, $m, $y]]; $a = $a[$h]; btw - 我发现这会产生很好的文本颜色: function colorFromText($text) return hsl2rgb(hueFromText($text)/0xFFFFFFFF, 0.8, 0.6); 感谢您提供代码 sn-p。不幸的是,就我而言,它生成的颜色非常相似。对于大约 20 个 2 位整数,我得到的颜色是 all between green and yellow。如果我首先用sha1() 散列$tstr,我确实是get more colours,但其中一些看起来仍然像重复。有没有更好的方法将任意文本转换为色调,或者我的约 20 个值是我要求太多了吗?【参考方案3】:

一个班轮:

substr(md5($string), 0, 6);

【讨论】:

【参考方案4】:

感谢指点,这似乎做得很好:

function stringToColorCode($str) 
  $code = dechex(crc32($str));
  $code = substr($code, 0, 6);
  return $code;


$str = 'test123';
print '<span style="background-color:#'.stringToColorCode($str).'">'.$str.'</span>';

【讨论】:

正是我正在寻找的解决方案。 这里提供了一个类似的概念但不同的哈希:***.com/questions/15704220/… 对我来说,它似乎提供了更多样化的颜色组合。也许 md5() 与 dechex(crc32()) 的哈希分布不同 为什么不简单地使用 bin2hex() 和 substr()?

以上是关于如何将字符串转换为 html 颜色代码哈希?的主要内容,如果未能解决你的问题,请参考以下文章

如何将哈希码对象值转换为字符串变量

如何将字符串颜色转换为其十六进制代码或 RGB 值?

该字符串的类型是啥以及如何将其转换为哈希?

将哈希转换为十六进制字符串

如何将Hex颜色值转换为libgdx颜色?

Java将哈希转换为随机字符串