【问题标题】:Hashing image names散列图像名称
【发布时间】:2014-08-01 08:53:48
【问题描述】:

我正在将图像上传到 S3,我希望为每个上传的图像创建一个唯一的名称。

我正在使用干预来制作图像:

$img = Image::make($file->getRealPath());

然后我对图像进行哈希处理:

$name = hash('sha256', $img);

问题是,当我上传同一张图片时,它被赋予了相同的名称。

我该如何解决这个问题?

【问题讨论】:

  • 试试$name = hash('sha256', $imgm, false)

标签: php hash sha


【解决方案1】:

您应该尝试在其中添加盐。即使附加日期/时间也应该给你一个唯一的名字。 干杯!

PS(编辑):

$data = Image::make($file->getRealPath())->encode('data-url'); 

$name = hash('sha256', $data . strval(time()));

首先,我们以“字符串方式”对数据进行编码,以便将时间值连接为字符串。

如果您想要额外的“随机性”,请添加用户 cookie、用户名等。

最终解决方案:

$data = implode('', file($file->getRealPath()));

$name = hash('sha256', $data .strval(time()));

【讨论】:

  • $data = Image::make($file->getRealPath())->encode('data-url'); $name = hash('sha256', $img .strval(time()));
  • 我最新的编辑不是最佳的,但应该可以。没测试过!
  • 谢谢,但我不想将图像编码为 data-url,使用您的方法意味着我必须对其进行两次编码。一个用于保存它,另一个用于哈希名称。
  • 这就是为什么我说它不是最佳的。你可以读一下: $data = implode('', file($file->getRealPath()));
  • 还有...为什么不使用 md5。比sha快。您要处理数百万张照片吗? (担心碰撞?!)如果没有,md5 对你来说已经足够了。
【解决方案2】:

您是否考虑过使用com_create_guid() 来创建一个全局唯一标识符?这将为您提供每个文件的唯一名称。例如:

$name = com_create_guid();

【讨论】:

  • 这是一个扩展?我宁愿不使用扩展。
  • 哦,是的。还有 uniqid() php.net//manual/en/function.uniqid.php 也是一个基本扩展。使用 UUID 为上传的文件生成唯一的文件名是很常见的(至少在 .NET 世界中)。
【解决方案3】:

避免这种情况的最佳方法是为每次上传使用时间戳。 只需使用 time() 函数将 $img 与当前时间戳结合即可。

例如:

hash('sha256', $img+time());

【讨论】:

  • 图片无法转换为int
【解决方案4】:

你可以尝试添加一个 rand()

hash('sha256', $img . rand(1,100) );

【讨论】:

  • 这仍然给了他选择相同随机数的危险。即使是 1%,你仍然没有消除他试图解决的问题。
猜你喜欢
  • 2017-10-24
  • 2018-01-30
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多