java - 生成对象的身份指纹
问题描述
为了在 SpringBoot 应用程序中实现缓存机制,我需要为某些类的对象生成一种无冲突的身份指纹。该指纹不应包括所有类属性,因为从缓存的角度来看,它们没有描述实例的身份,因此需要有意地将其中一些属性排除在计算之外。作为散列算法,我选择了 sha-256。
我关心的问题不是散列算法本身,而是如何确保稍后添加到类中的属性(即使在嵌套引用的类中)不会忘记在散列计算中有意包含或排除. 目前,在第一个 MVP 方法中,我将方法 ( String identityHash() {...}
) 添加到相关类中,其中包含硬编码的属性值连接,然后对其进行哈希处理。
但是,我更喜欢基于注解的方法:相关类的每个属性都应该有注解,它表示是否在哈希计算中包含属性值。
public class MyEntity {
@IdentityHash(include=false)
String id
@IdentityHash(include=true)
String attribute1
@IdentityHash(include=true)
MySubEntity subEntity
}
public class MySubEntity {
@IdentityHash(include=false)
String id
@IdentityHash(include=true)
Set<String> setOfValues
}
identityHash
我可以实现一个计算相应哈希值的服务,而不是在类上使用方法。但是在这里我不确定哪种方法是正确的。一种选择是:使用反射(例如 BeanUtils、PropertyUtils)来枚举属性(递归!),通过连接它们的值代表来构建散列输入(例如,需要首先对集合进行排序......)在这种情况下反射是否可以?用例?还有其他可能性吗?我想象像 ObjectMapper 这样的东西,它要么构建一个字符串(或字节 [])表示来计算哈希然后......
解决方案
推荐阅读
- git - 如何将远程分支的提交写入我的本地分支?
- flutter - Flutter - 如何访问 Wifi 详细信息?
- c# - 为什么玩家从不改变步行速度从不改变动画/秒?
- documentum - Documentum - [DFC_BOF_CLASS_CACHE_INIT_ERROR] 无法初始化类缓存
- c - 是否可以“放松” VS Code 中的问题?
- angular - 如何在我的 angular firebase 数据库的注册表单中添加 angular custom shield?
- xslt - 将值与小数进行比较
- javascript - 为什么对对象 setState 使用 ES6 计算属性语法?
- python - 移动平均线计算不正确
- kubernetes - Kubernetes 内的 systemd 服务无法获取环境