将整个PHP数组散列成唯一值[重复]
Posted
技术标签:
【中文标题】将整个PHP数组散列成唯一值[重复]【英文标题】:Hashing an entire PHP array into a unique value [duplicate] 【发布时间】: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));
【参考方案1】:
使用md5(serialize())
而不是print_r()
。
print_r()
的目的主要是作为一个调试功能,并被格式化为纯文本显示,而serialize()
将数组或对象表示编码为紧凑的文本字符串,用于数据库或会话存储(或任何其他持久性)中的持久性机制)。
【讨论】:
感谢您的回答。有什么理由序列化会更好吗? 很想看看这个方法的一些基准和它的替代方案。 @fieg:显然序列化在性能方面获胜。这是数据:***.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()
可能会更保守...
【讨论】:
以上是关于将整个PHP数组散列成唯一值[重复]的主要内容,如果未能解决你的问题,请参考以下文章