如何使用PHP GD从哈希信息生成唯一的图像?

11

您好,

在我正在工作的网站上,我想显示一张唯一的图片给用户,这张图片是使用他的电子邮件地址的哈希值生成的。

我应该生成分形图像吗?

如果是这样,如何使其“独特”,更具体地说,如何让刚登陆的用户更容易识别它们?

我非常喜欢Stackoverflow为新用户提供的相关用户图像。

我正在使用PHP GD。

非常感谢任何实现此目标的提示。


这正是gravatar.com所做的。你考虑过使用它们吗? - Sampson
@Jonathan,那个API最终用于使用您的个人头像或其他内容。我只想要一张用户可以识别为“真实网站”的图像。显示从他自己的电子邮件地址生成的图像(在系统中应该是唯一的)。 - Cybrix
+1 我很想看看社区会有什么样的实现。 - Sampson
3个回答

3

这正是我正在寻找的。有没有这个概念/想法的名称,以便我可以找到其他例子? - Cybrix
1
@Cybrix,抱歉我不知道它可能被称为什么。我在上面的链接中命名函数时遇到了困难(我做出了贡献)。最初,我认为可能类似于“hash_image”,因为它的工作方式几乎像哈希函数,只是你生成的是彩色多边形而不是字符。 - Mike C
1
@Cybrix 它们被称为“标识图”。 - Derek Illchuk

1

特别是,使用identicon参数作为默认选项应该可以,例如http://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d53?d=identicon 现在让我们希望您计算的哈希值不会与某人的电子邮件地址的哈希值冲突,否则您将得到他们的图片;) - Emilien

0
这可能会对你有所帮助;它是使用图像处理库的简单实现。
function unique_image($string, $img_w = 400)
{
    $hash = hash('md5', $string);
    $bytes = mb_strlen($hash, '8bit');
    $image = Image::canvas($img_w, $img_w, array_map('ord', str_split(substr($hash, -3, 3))));

    # Set color blocks.
    $blocks = [];
    for ($i = 0; $i < $bytes; $i++) $blocks[floor($i / 3)][] = ord($hash[$i]);

    $image_area = pow($img_w, 2);
    $square_area = $image_area / count($blocks);
    $sqr_w = sqrt($square_area);
    $cols = floor($img_w / $sqr_w);
    $spacing = ($img_w - $cols * $sqr_w) / 2;

    for ($x = 0; $x < $cols; $x++) for ($y = 0; $y < $cols; $y++) {
        $p['x1'] = $spacing + $sqr_w * $x;
        $p['y1'] = $spacing + $sqr_w * $y;
        $p['x2'] = $spacing + $sqr_w * ($x + 1);
        $p['y2'] = $spacing + $sqr_w * ($y + 1);

        $image->rectangle($p['x1'], $p['y1'], $p['x2'], $p['y2'], function ($draw) use ($x, $y, $blocks) {
            $block = $blocks[$x + $y];

            # Set square background (RGB), and the border.
            $draw->background([$block[0], ($block[1] ?? 0), ($block[2] ?? 0)]);
            $draw->border(1.8, '#aaa');
        });
    }

    # Return image.
    return $image->response();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接