将整个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数组散列成唯一值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 仅将唯一值添加到数组中

散列键/值作为数组[重复]

Redis 哈希(Hash)

PHP合并数组只有不重复的值

php数组的重复值如何过滤掉

ArrayMap和HashMap区别