我正在寻找一种方法来为 PHP 对象生成某种哈希值(通用解决方案,如果可能的话,可以使用所有分类的、内置的和自定义的)。
SplObjectStorage::getHash 不是我正在寻找的,因为它会为给定类的每个实例生成不同的哈希值。为了描述这个问题,让我们考虑简单的类:
class A() {
public $field; //public only for simplicity
}
和该类的 2 个实例:
$a = new A(); $a->field = 'b';
$b = new A(); $b->field = 'b';
我尝试过的每个内置函数都会为这些对象返回不同的哈希值,而我想要一些function f($x)
有财产f($a) == f($b) => $a == $b
.
我知道我可以编写一个递归遍历所有对象属性的函数,直到找到一个可以转换为字符串的属性,以奇特的方式连接该字符串并进行哈希,但这种解决方案的性能会很糟糕。
有没有有效的方法来做到这一点?
假设我理解正确,您可以序列化对象,然后对序列化对象进行 md5 处理。由于如果所有属性都相同,序列化会创建相同的字符串,因此每次都应该获得相同的哈希值。除非您的对象具有某种时间戳属性。例子:
class A {
public $field;
}
$a = new A;
$b = new A;
$a->field = 'test';
$b->field = 'test';
echo md5(serialize($a)) . "\n";
echo md5(serialize($b)) . "\n";
output:
0a0a68371e44a55cfdeabb04e61b70f7
0a0a68371e44a55cfdeabb04e61b70f7
你的结果会有所不同,因为 php 内存中的对象存储有每个实例化的编号 id:
object(A)#1 (1) {...
object(A)#2 (1) {...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)