PHP - 以某种方式哈希对象,具有相同字段值的不同对象具有相同的哈希值

2024-04-22

我正在寻找一种方法来为 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(使用前将#替换为@)

PHP - 以某种方式哈希对象,具有相同字段值的不同对象具有相同的哈希值 的相关文章

随机推荐

  • Java JFormattedTextfield 时间格式化

    我在代码中使用时间时遇到了一些麻烦 txtDauer new JFormattedTextField txtDauer setFormatterFactory new DefaultFormatterFactory new DateForm
  • 尝试让 POST 返回 400 错误请求

    我有一个通过关联构建新模型的 create 方法 如果 POST 请求中没有参数 我希望它返回带有一些文本的 400 响应 但是 我收到错误 这是在 Rails 4 0 2 中 控制器方法 def create cast profile c
  • jQuery - .children().size() 更改时触发事件

    我已经搜索了近和远 但我不知道如何在子元素的 size 上放置侦听器 我想做的是 我有一个包含 0 6 个以上子元素的 div 这个数字没有定义 因为我正在制作一个购物车 我希望有一个侦听器 而不是每个可以更改购物车中的商品数量的按钮 即添
  • 来自 json 数据的 Padrino 模型

    我一直在为我正在从事的一个项目寻找 Padrino 它似乎非常适合 因为我理想情况下希望支持以 json 形式发送和接收数据 但是我想知道是否有任何内置的自动化帮助程序或功能可以从发布请求 或其他请求 中获取数据并将该数据放入模型中 而无需
  • IIS8 Express 上的 SqlRoleProvider

    我的 Web 应用程序 WCF 服务 使用SqlRoleProvider 这适用于Visual Studio 开发服务器 将其切换到IIS8 Express导致它抛出一个NullReferenceException though Roles
  • pandas HDFStore - 如何重新打开?

    我使用以下方法创建了一个文件 store pd HDFStore home data h5 并使用以下方法存储一些表 store firstSet df1 store close 我关闭了python并在一个新的环境中重新打开 我如何重新打
  • 使用Python的Requests模块登录ASP网站

    我试图从我的学校页面上抓取一些信息 但我很难通过登录 我知道有类似的线程 我花了一整天的时间阅读 但无法使其发挥作用 这是我使用的程序 用户名和密码已更改 import requests payload ctl00 cphmain Logi
  • 按值对 Javascript 对象进行排序

    在我的 Javascript 应用程序中 我有一个对象 我需要能够通过内部对象中的值对数组进行排序 例如 a timestamp xxxxxx other yyyyyy b timestamp xxxxxx other yyyyyy c t
  • 如何检查数组的某一项是否具有真值

    在对象数组中 如何检查任何数组项是否具有 true 属性 我有一个对象数组 我需要检查数组项中是否有一个属性 其值确实是 const arr name Tony test false name Jack test false name Ti
  • 在单线程中的 List.Add 过程中,什么可能导致“目标数组不够长”?

    我有一个要添加到嵌套 foreach 循环中的对象列表 该操作是同步的 或者也许我并不像我认为的那样理解 lambda 并且是单线程的 并且列表并不是不合理的大 我完全不知道可能导致此异常的原因 public string Promotio
  • 从覆盖率报告中删除自动生成的异常代码

    让我们从一个最小的工作示例开始 主要 cpp include
  • C# 在枚举中使用数字

    这是一个有效的枚举 public enum myEnum a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 0xff 但这不是 public enum myEnum 1a 1 2a 2 3a 3 有没有办法在枚举中使用数字 我已经
  • 在 Ember.js 中,为什么绑定到数组在 {{#each}} 之外不起作用?

    在下面的代码中 我渲染了 3 个视图 第二个和第三个视图渲染App controller a 单击第一个视图会发生变化App controller a 单击时 第三个视图会更新其内容 第二个视图不更新其内容 为什么 我认为第二个视图绑定到数
  • open() 尝试打开管道进行读取时会阻塞

    我有两个进程 一个服务器和一个客户端 它们应该通过管道 C Linux 进行通信 服务器打开管道O RDONLY标志 以及客户端O WRONLY 然而 服务器阻塞在open函数 而客户端似乎运行成功 open函数返回成功 因此write功能
  • dplyr 就地突变[重复]

    这个问题在这里已经有答案了 这是我的例子 library dplyr a lt c 0 2 1 3 df test lt data frame a df test gt mutate a round a 0 它产生 a 1 0 2 1 但不
  • R传单和闪亮如何清除地图点击数据

    下面的例子摘自RStudio 教程 http rstudio github io leaflet shiny html传单上 我稍微修改了一下以适应我的问题 我有一张地图 这里是地震 我使用它在地图上绘制addCircleMarkers单击
  • NSLayoutConstraint 常量设置后不更新

    我有一个UIView具有相应的子类xib文件 在我的 xib 中我有一个NSLayoutConstraint我正在尝试为其设置动画的属性 我有一个animateIn方法 问题是只有 animateIn 方法有效 当我尝试再次更新常量时 它只
  • 正则表达式捕获第 n 个匹配项

    有没有办法使用正则表达式返回第 n 次出现 我确实搜索了论坛 只找到了超出正则表达式本身的解决方案 即需要编程语言的支持 例子 正则表达式 d d 3 d 2 Input thiscanbeanything 25 74thiscanbeso
  • RealityKit – 什么是 `steelBox` 实例加载?

    当您使用标准 Xcode 模板创建增强现实项目时 Xcode 会添加以下内容swift文件到您的项目 Experience swift GENERATED CONTENT DO NOT EDIT import Foundation impo
  • PHP - 以某种方式哈希对象,具有相同字段值的不同对象具有相同的哈希值

    我正在寻找一种方法来为 PHP 对象生成某种哈希值 通用解决方案 如果可能的话 可以使用所有分类的 内置的和自定义的 SplObjectStorage getHash 不是我正在寻找的 因为它会为给定类的每个实例生成不同的哈希值 为了描述这