简介:
我需要一个函数,可以接受一个数组并返回它的散列
这应该类似于spl_object_hash((,只是它返回给定数组的哈希。
到目前为止,我已经尝试过
function array_hash(array $array) {
return spl_object_hash((object) $array);
}
问题
1( 这个算法本身并不有效。例如,如果我通过这样的东西:
$array = array(
'foo' => 'bar',
'bool' => false,
'junk' => array(
'junk1' => array('foo' => array('__test__'))
)
)
它不会将嵌套数组强制转换为对象。
2( 另一个主要问题是,spl_object_hash()
在每个新的HTTP请求上为同一对象返回不同的散列。
问题
再次:我需要一个数组的持久散列。与spl_object_hash()
不同,将在每个HTTP请求上持久化如何正确地执行此操作
先序列化数组怎么样?
md5(serialize($array));
Martin的上述回答很好,但我所做的是:
function array_signature($arr, $sort=true)
{
// Sorting helps generating a similar fingerprint for similar arrays
if($sort) {
array_multisort($arr);
}
// MD5 seems to be the fastest hashing function -- we don't care about collision for this
// JSON seems faster than serialize()
return md5(json_encode($arr));
}
调用array_multisort()
首先确保对于关联数组,返回相同的签名:
['a'=>1, 'b'=>2]
['b'=>2, 'a'=>1]
基准测试似乎一致认为:md5()
是PHP中最快的哈希函数。它有很多潜在的安全问题,所以不应该用于哈希密码,但对于数组签名来说,这不应该是一个问题。
类似地,json_encode()
是PHP中最快的编码算法(比serialize()
快(