如何在 C++ 中计算对象的哈希/校验和/指纹?
要求:
函数必须是'内射'(*)。换句话说,不应该有两个不同的输入对象,它们返回相同的哈希/校验和/指纹。
背景:
我试图提出一个简单的模式来检查实体对象自构建以来是否已更改。(为了知道数据库中哪些对象需要更新)。
请注意,我特别不想在我的 setter 或其他任何地方将对象标记为已更改。
我正在考虑以下模式:简而言之,每个应该持久化的实体对象都有一个成员函数“bool is_changed()”。在此上下文中,已更改意味着自调用对象的构造函数以来已更改。
注意:我做这一切的动机是避免将对象标记为干净/脏或进行成员与成员比较的样板代码。换句话说,降低人为错误的风险。
(警告:前面的 psudo c++ 代码。我还没有尝试编译它)。
class Foo {
private:
std::string my_string;
// Assume the "fingerprint" is of type long.
long original_fingerprint;
long current_fingerprint()
{
// *** Suggestions on which algorithm to use here? ***
}
public:
Foo(const std::string& my_string) :
my_string(my_string)
{
original_fingerprint = current_fingerprint();
}
bool is_changed() const
{
// If new calculation of fingerprint is different from the one
// calculated in the constructor, then the …Run Code Online (Sandbox Code Playgroud) 在《清洁建筑》(Robert C. Martin)一书中。191,他指出“实体是纯粹的业务逻辑,别无其他”。我不确定我应该如何从持久性机制的实体知识方面解释这一说法。
我假设实体对象是有状态的-它们操纵了它们代表的业务数据。如果是这样,则必须通知持久层该数据的更改,以便它可以保留这些更改。因此; 实体是否可以保留对持久性接口(或工作单元接口,如果设计更为精细的话)的引用?
我倾向于认为,拥有这样一个引用(并从实体内部调用)的实体对象将不是“纯业务规则”。但我有一种感觉,只要实体持有对接口的引用,它就不算数吗?
而且,如果实体不应保留对持久性机制的引用,那么是否存在其他用于持久化业务数据更改的良好模式?
architecture design-patterns unit-of-work clean-architecture