来自std::any的足够哈希 < C++ >是否有足够的方法从STD:任何商店的数据中提取散列? 嗯,或者至少是字节列表形式的对象及其长度是一种类型安全机制,用于通过不需要知道该类型的中介将已知类型的对象从一个位置传递到另一个位置。从中计算散列不是它的目标。事实上,如果不损害任何的功能,这是不可能实现的

来自std::any的足够哈希 < C++ >是否有足够的方法从STD:任何商店的数据中提取散列? 嗯,或者至少是字节列表形式的对象及其长度是一种类型安全机制,用于通过不需要知道该类型的中介将已知类型的对象从一个位置传递到另一个位置。从中计算散列不是它的目标。事实上,如果不损害任何的功能,这是不可能实现的,c++,hash,stdany,C++,Hash,Stdany,散列一个对象需要了解该对象正在做什么。假设您只需查看对象表示的字节,从而从中计算出有意义的散列,结果不会很好。它可能会起作用。。。有一段时间。但最终,它会做错事 您可以创建一个类型擦除类型,类似于要求对象实现哈希的any。但是std::any不是那种类型,因为任何人如果不想将他们放入any中的类型散列,就无法将所述对象存储在any中 这是因为any提供的任何操作都是存储在any中的所有类型也必须提供的操作。例如,any是可复制的,因此any不能存储仅移动类型。这对那些想这样做的人来说是一个烦恼,

散列一个对象需要了解该对象正在做什么。假设您只需查看对象表示的字节,从而从中计算出有意义的散列,结果不会很好。它可能会起作用。。。有一段时间。但最终,它会做错事

您可以创建一个类型擦除类型,类似于要求对象实现哈希的
any
。但是
std::any
不是那种类型,因为任何人如果不想将他们放入
any
中的类型散列,就无法将所述对象存储在
any


这是因为
any
提供的任何操作都是存储在
any
中的所有类型也必须提供的操作。例如,
any
是可复制的,因此
any
不能存储仅移动类型。这对那些想这样做的人来说是一个烦恼,你在
any
中转储的功能越多,该类型存储“any”事物的能力就变得越受限。

@KonradRudolph:“想使用std::any作为字典键类型是完全合法的”否,对于散列容器,想要删除类型字典键类型是合法的。那
std::any
应该是那种类型完全是另一种讨论。我提醒您,
any
需要具备的任何功能都是您放入
any
中的所有内容必须具备的功能。如果
any
是可散列的,那么放入
any
的所有类型也必须是可散列的。因此,即使我从未使用过它的散列功能,我的类型也必须是可散列的。@KonradRudolph:
any
不要求所讨论的类型是相等可比的,这就是为什么
any
不能相等可比的原因。静态类型的语言根本不适合某种全擦除类型,这种类型可以将每个操作转发给类型擦除对象。尤其是当您只希望该功能有条件可用时。@KonradRudolph:“根据需要将此类操作转发到基础类型”有些问题;我同意Nicol的观点,满足这一点不应该是任何的责任,尤其是在您预期的范围内。也就是说,应该有某种方法来散列类型擦除的值。也许是对它们的序列化进行了哈希处理?如果使用std::any来实现这一点是有问题的,那么这样的实现可以修复它吗?(我想模拟C#中的Dictionary)@dodickgod:如果我们忽略代码中完全缺乏类型安全性,那么它的工作范围将达到我在回答中所概述的程度。也就是说,它要求存储在包装器中的任何内容都是可哈希类型。但是不要忘记,类型需要具有相等可比性,因为哈希表必须对值进行相等测试。因此,您需要正确地进行类型擦除相等测试,特别是在不同类型的对象之间。您能解释一下为什么要这样做吗?在将值插入
std::any
并将它们存储在类似
struct HashedValue{std::size\u t hash;std::any value}的东西中之前,您是否考虑过计算所需的哈希值?@alterigel:这样做会不会有过度碰撞的风险?我的意思是,AFAICR,类型信息不会与实际值一起散列。@einpoklum:假设散列函数很好,添加类型信息只会影响哪些值发生冲突。@MSalters是的。例如,C#字典认为int(1)和long(1)是不同的对象