std::hash实现太简单分布不匀
来源:互联网 发布:淘宝充的话费可以退吗 编辑:程序博客网 时间:2024/05/16 15:24
std::hash实现太简单分布不匀
(金庆的专栏 2017.5)
#include <iostream>
#include <functional>
using namespace std;
int main()
{
std::hash<int> hasher;
cout << hasher(2) << endl;
cout << hasher(3) << endl;
cout << hasher(4) << endl;
return 0;
}
输出为
jinqing@server:~/test$ g++ main.cpp -std=c++11
jinqing@server:~/test$ ./a.out
2
3
4
查看实现,/usr/include/c++/5/bits/functional_hash.h
operator()(_Tp __val) const noexcept \
{ return static_cast<size_t>(__val); } \
所以对分布有要求的,应该使用自己的hash, 不要使用 std::hash.
boost::hash 的实现也是简单取值,
boost_1_60_0/boost/functional/hash/hash.hpp
template <typename T>
typename boost::hash_detail::basic_numbers<T>::type hash_value(T v)
{
return static_cast<std::size_t>(v);
}
Boost说明了hash用于STL容器,而不是其它。
This hash function is designed to be used in containers based on the STL and is not suitable as a general purpose hash function.
VS2015会使用 FNV-1a
size_t operator()(const argument_type& _Keyval) const
{ // hash _Keyval to size_t value by pseudorandomizing transform
return (_Hash_seq((const unsigned char *)_Keyval.c_str(),
_Keyval.size() * sizeof (_Elem)));
}
inline size_t _Hash_seq(const unsigned char *_First, size_t _Count)
{ // FNV-1a hash function for bytes in [_First, _First + _Count)
...
但 FNV-1a 也不是通用的 hash 函数,如果输入值相近,则其输出值也相近。
(金庆的专栏 2017.5)
#include <iostream>
#include <functional>
using namespace std;
int main()
{
std::hash<int> hasher;
cout << hasher(2) << endl;
cout << hasher(3) << endl;
cout << hasher(4) << endl;
return 0;
}
输出为
jinqing@server:~/test$ g++ main.cpp -std=c++11
jinqing@server:~/test$ ./a.out
2
3
4
查看实现,/usr/include/c++/5/bits/functional_hash.h
operator()(_Tp __val) const noexcept \
{ return static_cast<size_t>(__val); } \
所以对分布有要求的,应该使用自己的hash, 不要使用 std::hash.
boost::hash 的实现也是简单取值,
boost_1_60_0/boost/functional/hash/hash.hpp
template <typename T>
typename boost::hash_detail::basic_numbers<T>::type hash_value(T v)
{
return static_cast<std::size_t>(v);
}
Boost说明了hash用于STL容器,而不是其它。
This hash function is designed to be used in containers based on the STL and is not suitable as a general purpose hash function.
VS2015会使用 FNV-1a
size_t operator()(const argument_type& _Keyval) const
{ // hash _Keyval to size_t value by pseudorandomizing transform
return (_Hash_seq((const unsigned char *)_Keyval.c_str(),
_Keyval.size() * sizeof (_Elem)));
}
inline size_t _Hash_seq(const unsigned char *_First, size_t _Count)
{ // FNV-1a hash function for bytes in [_First, _First + _Count)
...
但 FNV-1a 也不是通用的 hash 函数,如果输入值相近,则其输出值也相近。
阅读全文
0 0
- std::hash实现太简单分布不匀
- php正太分布实现方法
- hash表简单实现
- 简单实现hash存储
- 实现简单的 std::cout
- 实现简单的 std::cout
- 正太分布笔记
- 正太分布
- 正太分布
- C++简单实现hash table
- 希尔排序实现(不太满意)
- php实现简单的分布显示
- MATLAB正太分布函数
- R-正太分布,检验
- 一些不太常见的问题的简单备注
- PHP hash表hash分布测试
- [hash] -- 分布均匀的hash函数
- 随机抽样方法正太分布 MC, MCMC, Gibbs采样 原理&实现(in R)
- Android 自定义ScrollView嵌套滚动兼容,监听滑动状态:顶部、底部、停止、滑动中
- smoj1710:砖块II (dp套dp)
- 为php设置系统变量、环境变量
- Android 长LOG打印不全解决办法一
- DataFrame.mean()函数
- std::hash实现太简单分布不匀
- H5响应式设计可以为你网站带来什么?
- mac的java环境配置
- POJ 3126 Prime Path
- 【C#/WPF】Image图片的Transform变换:平移、缩放、旋转
- JavaWeb三大组件之一Servlet【response讲解】
- uml介绍
- Discrollview自定义的动态布局
- Spring MVC @ModelAttribute详解