您好,
在我正在工作的网站上,我想显示一张唯一的图片给用户,这张图片是使用他的电子邮件地址的哈希值生成的。
我应该生成分形图像吗?
如果是这样,如何使其“独特”,更具体地说,如何让刚登陆的用户更容易识别它们?
我非常喜欢Stackoverflow为新用户提供的相关用户图像。
我正在使用PHP GD。
非常感谢任何实现此目标的提示。
您好,
在我正在工作的网站上,我想显示一张唯一的图片给用户,这张图片是使用他的电子邮件地址的哈希值生成的。
我应该生成分形图像吗?
如果是这样,如何使其“独特”,更具体地说,如何让刚登陆的用户更容易识别它们?
我非常喜欢Stackoverflow为新用户提供的相关用户图像。
我正在使用PHP GD。
非常感谢任何实现此目标的提示。
这里有一些你可以运行的源代码:http://www.exorithm.com/algorithm/view/unique_image
看起来有点像SOF图像。
identicon
参数作为默认选项应该可以,例如http://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d53?d=identicon 现在让我们希望您计算的哈希值不会与某人的电子邮件地址的哈希值冲突,否则您将得到他们的图片;) - Emilienfunction 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();
}