首页 > 解决方案 > 生成对象的身份指纹

问题描述

为了在 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 这样的东西,它要么构建一个字符串(或字节 [])表示来计算哈希然后......

标签: javaspring-bootreflection

解决方案


推荐阅读