【问题标题】:Hashing an entire PHP array into a unique value [duplicate]将整个PHP数组散列成唯一值[重复]
【发布时间】:2011-07-03 03:05:31
【问题描述】:

寻找一种方法来生成给定 PHP 数组的文件名安全哈希。我目前正在做:

$filename = md5(print_r($someArray, true));

...但使用 print_r() 生成每个数组唯一的字符串感觉“hacky”。​​

对于更清洁的方法有什么好主意吗?

编辑 好吧,似乎每个人都认为序列化更适合这项任务。有什么理由吗?我不担心在散列后检索有关变量的信息(这很好,因为它是单向散列!)。感谢您的回复!

【问题讨论】:

  • 我认为这是一种相当不错的方式,实际上。
  • 我会说这两种方式都同样有效。但是,考虑到它们在用途上的差异,原则上使用 serialize 代替 print_r 似乎更正确。但这只有当你有像我这样的程序员强迫症时。 :)
  • sha1 似乎更独特。 $sign = sha1(json_encode($data));

标签: php arrays hash


【解决方案1】:

使用md5(serialize()) 而不是print_r()

print_r() 的目的主要是作为一个调试功能,并被格式化为纯文本显示,而serialize() 将数组或对象表示编码为紧凑的文本字符串,用于数据库或会话存储(或任何其他持久性)中的持久性机制)。

【讨论】:

  • 感谢您的回答。有什么理由序列化会更好吗?
  • 很想看看这个方法的一些基准和它的替代方案。
  • @fieg:显然序列化在性能方面获胜。这是数据:stackoverflow.com/a/32846231/680382
  • 正如@gogowitsch 提到的链接所指出的,您还需要考虑数组的顺序。
  • 这是最好的。我已经从数组中提取了必要的字段以更好地散列它。
【解决方案2】:

您也可以使用json_encode

【讨论】:

  • 使用 json_encode 提供哈希种子是不安全的。例如,如果您与 json_encode 一起使用的数组包含非 UTF-8 字符,则 json_encode 将返回 false,这将使您的所有 md5 哈希值相同。
【解决方案3】:

serialize() 应该可以正常工作。

它具有在对象上调用__sleep 魔术方法的额外优势,并且是整个PHP 中可用的最干净的序列化方法。

【讨论】:

  • 我喜欢这是发布的第一个答案,但从一开始就得到了正确的结果,这些年来甚至没有一次编辑
【解决方案4】:

序列化呢?

$filename = md5(serialize($someArray));

【讨论】:

    【解决方案5】:

    如果您想保留类型等,使用serialize() 可能会更保守...

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多