两个成员中任意一个成员的哈希
Hashing by either one of two members
虽然这个问题是关于c++的,但它是一个通用的哈希问题,可能也适用于其他语言。
我有一个类,它由或它拥有的两个成员中的一个来标识(让我们称它们为device&name)。
class Foo {
static const int NO_DEVICE = 0;
bool isDeviceSet() {
return device != NO_DEVICE;
}
private:
int device;
std::string name;
};
我想识别一个优先级高于device
的Foo
实例(当它被设置时)
也就是说,当设置device
时,我希望根据device
进行散列(仅!-这样,具有相同device
和不同name
的两个Foo
将被视为相同的对象散列)
当未设置device
时,我希望根据name
进行散列。
我的问题:
其中任何一个成员的散列是否足够安全?
例如,任何一种方法的散列都是这样的:
namespace std {
size_t hash<Foo>::operator()(Foo const& f) const {
if (f.isDeviceSet()) {
return std::hash<int>()(f.deviceId);
}
return std::hash<std::string>()(f.name);
}
}
这方面的问题是,人们可能会争辩说(根据每个哈希函数的实现),两个不同的Foo
,一个具有device
集,一个没有device
集,具有相同哈希代码的概率是未知的(尽管可能性很小)。
- 考虑一个int散列函数,它转换为字符串并调用字符串的散列——这将导致
Foo{2, "bar"}
和Foo{0, "2"}
具有相同的散列代码
另一方面,我不确定在散列中组合isDeviceSet()
是否真的会给出更好的结果(对于一般情况——显然它解决了上面项目符号中的例子):
namespace std {
size_t hash<Foo>::operator()(Foo const& f) const {
if (f.isDeviceSet()) {
std::pair<bool, int> p(f.isDeviceSet(), f.device);
boost::hash< std::pair<bool, int> > hasher;
return hasher(p);
}
std::pair<bool, std::string> p(f.isDeviceIdSet(), f.name);
boost::hash< std::pair<bool, std::string> > hasher;
return hasher(p);
}
}
欢迎任何见解/其他杂烩想法。
哈希总是与相等一起进行。
您需要定义一个相等操作,该操作与您认为相等的元素匹配,与您认为不相等的元素不匹配。
然后定义一个散列函数,该函数必须具有等式认为等于同一散列代码的所有元素。对于被认为不平等的元素,根本没有任何要求。
任何涉及哈希的算法都必须在不相等对象的相等哈希代码中生存,而不会出现问题;如果可能的对象比可能的散列码多,则永远不可能保证不同对象的散列码不同。即使您的哈希函数只返回0,任何使用它的算法都应该正常工作,除非可能效率较低。
当你考虑制作哈希函数有多复杂时:它应该只让具有相同哈希代码的现有对象集变小。它不一定是完美的,除非你有一个真正性能关键的哈希表。但是散列函数本身在某种程度上也是性能关键的。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- boost::包含提升单元的元组的哈希值
- 使用 Key 对 C++ 中的哈希映射进行排序. 无法排序
- C++中的并发哈希表
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 函数指针(类成员函数)的哈希映射
- 两个成员中任意一个成员的哈希
- 内部作用域枚举、哈希函数和无序集数据成员
- 不完整成员类型的哈希函数
- TBB并发哈希映射作为结构的成员