将整个PHP数组哈希为唯一值

63

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

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

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

有没有更简洁的方法呢?

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


2
我认为这实际上是一个相当不错的做法。 - Dutchie432
我认为两种方法同样有效。然而,考虑到它们在目的上的差异,原则上使用serialize似乎更正确。但这只是如果你像我一样有程序员强迫症的情况下。 :) - OCDev
sha1 seems more unique. $sign = sha1(json_encode($data)); - Hebe
5个回答

105

使用md5(serialize())代替print_r()

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


谢谢你的回答。有什么原因使序列化更好吗? - loneboat
很想看看这种方法及其替代方案的基准测试。 - Fieg
1
@fieg:显然,就性能而言,序列化更胜一筹。这是数据:https://dev59.com/zXE95IYBdhLWcg3wkeuq#32846231 - Gogowitsch
2
正如@gogowitsch提到的链接所指出的那样,您还需要考虑数组的排序。 - Agi
这是最好的一个。我已经从数组中提取了必要的字段,以更好地进行哈希处理。 - Guilherme Sampaio

25

2
使用json_encode提供哈希种子是不安全的。例如,如果您使用json_encode的数组具有非UTF-8字符,则json_encode将返回false,这将使所有md5哈希值相同。 - Amir Iskander

14

serialize() 应该可以正常使用。

它有额外的优点,即调用对象的 __sleep 魔术方法,并且是 PHP 中最干净的序列化方法。


我喜欢这是第一个发布的答案,而且在所有这些年里从一开始就正确,甚至没有进行任何编辑。 - ᴍᴇʜᴏᴠ

10

关于序列化,您怎么看?

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


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

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