偶尔,我发现我需要对一些对象进行排序,并按多个值对它们进行分组。我通常通过将值连接在一起来实现这一点,中间使用下划线或其他描述符,然后将其用作数组索引。
// group all objects with a common parent_id, date, and type
foreach ($objects as $obj) {
$hash = $obj->parent_id . '_' . $obj->date . '_' . $obj->type;
$sorted_objects[$hash][] = $obj;
}
...麻烦!除了滥用PHP的松散输入和字符串连接之外,还有一种更好的方法。有没有办法对多个值执行哈希?看来我应该能够做这样的事情:
$hash = sha1_multiple($obj->parent-id, $obj->date, $obj->type);
我已经使用过最好的方法,还是有更好的方法?
答案 0 :(得分:5)
使用PHP的序列化使它更整洁,但效率更低:
function sha1_multiple() {
$args = func_get_args();
return sha1(serialize($args));
}
答案 1 :(得分:3)
由于散列键是字符串,你可能已经通过字符串连接的散列实现了最佳方式 - 这就是我在过去需要时执行类似功能的方式。
答案 2 :(得分:0)
在concat-then-hash中,“ Jim”和“ Fisher”的哈希是“ JimFisher”的哈希。反转输入会生成哈希字符串“ FisherJim”,这是一个不同的字符串,因此,通过重新排序输入,它不会受到攻击。那么,concat-then-hash不受第二次原像攻击的影响吗?您能否找到另一个与hash2_concat_then_hash(“ Jim”,“ Fisher”)冲突的输入的示例?同样,您无需强行使用它!一个示例是hash2_concat_then_hash(“ Ji”,“ mFisher”),因为“ Ji”和“ mFisher”也连接到“ JimFisher”。
有关更多信息,请查看how-to-hash-multiple-values