【问题标题】:Creating random colours in PHP based on a string基于字符串在 PHP 中创建随机颜色
【发布时间】:2020-04-14 18:03:59
【问题描述】:

我想根据字符串创建可预测/确定的颜色。如,提供两个相同值的字符串将生成相同的颜色。这是我当前的代码:

mt_srand(bin2hex($file)); //Convert filename to hex and seed Mersenne Twister with it
echo str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);

但是,这似乎不起作用。知道如何实现这一目标吗?

【问题讨论】:

  • 只对输入进行哈希处理并去掉 6 位哈希值会更简单。
  • @Sammitch 这就是我最终做的,而且效果很好。谢谢:D

标签: php colors hex random-seed deterministic


【解决方案1】:

嗯,这真的取决于你要设置什么参数来形成这个十六进制代码。有很多方法可以实现这一点。

为了简单介绍一下,我做了以下几点:

$str_u = unpack("C*", "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");

    $byte_output = [0x00, 0x00, 0x00];

    $c = 0;
    foreach($str_u as $b)
    {
        $byte_output[$c % count($byte_output)] ^= $b; 
        $c++;
    }

    var_dump($byte_output);

基本上遍历字符串中的每个字节并对 $byte_output 数组中的每个值执行异或,但字符串中的每个字节只与输出中的一个字节交互。

这将为不同的字符串提供始终如一的相同结果。考虑字符串中的每个字符并将其压缩成给定数量的字节只是一个简单的参数。也就是说,您可以使用几乎任何您想要的参数,只要您不涉及随机函数即可。

【讨论】:

  • 感谢您的回答。我尝试了这个解决方案并将其实现到我的代码中,使用dechex() 将整数字节转换为十六进制字符串。然而,所有颜色似乎都遵循一个明显的模式,并且看起来不够随机:/我最终采用了@Sammitch 建议的方法,即对字符串进行散列并将其截断为六个字符,效果非常好:D跨度>
  • @GuineaPig 是的,老实说,这听起来是更好的选择。但只是把它扔在那里,如果你只在你的字符串上使用英文字母字符,这可能会导致我编写的代码上的颜色数量减少(英文字符总是保持在 127 以下)。从 127-255 添加一些内容可能会有所帮助。就像...^= (($b < 127) && ($c % 2)) ? $b << 1 : $b; 一样,每个奇数字符都向右移动 1,让您获得完整的 0-255 范围。
  • @GuineaPig 另外,请确保十六进制字符串具有适当的大小,根据整数,您可能会得到 4/5 位而不是 6 位,可能需要添加一些填充 0。
猜你喜欢
  • 2018-11-15
  • 2016-05-29
  • 2011-05-13
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多