最近稍微整理了下tbox的utils模块,发现里面有很多都是一些,之前放置的hash算法,例如:md5, sha1, crc32, adler32啊什么,比较凌乱。
因此我抽时间整理下这些hash算法,打算单独建立个hash算法模块,来放置各种大大小小的hash算法。
顺便把tbox里面用到的一些字符串hash算法,也做了些整理,一并归并到这个新模块中,例如比较常用的一些字符串哈希:
bkdr, fnv, fnv-1a, aphash, rshash, djb2, murmur, sdbm, blizzard ...
其中 bkdr 的效果比较好,因此目前作为tbox里面主要的string哈希来用,其他的hash虽然实现
继续阅读 »
There is a hash table:
It has b buckets.
It has n keys stored in it.
We assume that the hash function distributes keys uniformly.
A bucket can contain more than 1 keys.
继续阅读 »
mdtoc start
hash表中key的分布规律
当hash表中key和bucket数量一样时(n/b=1):
key的数量对3类bucket数量的影响
key的数量对bucket的均匀程度的影响
Load Factor: n/b<0.75
Load Factor: n/b>1
n/b 越大, key的分布越均匀.
计算
每类bucket的数量
空bucket 数量
有1个key的bucket的数量
多个key的bucket
key在bucket中分布的均匀程度
通过~~正太~~正态分布来近似
计算最小key数量 x
程序模拟
Reference
继续阅读 »
【什么是Hash】
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
继续阅读 »
Bloom Filter是由Bloom在1970年提出的一种快速查找算法,通过多个hash算法来共同判断某个元素是否在某个集合内。可以用于网络爬虫的url重复过滤、垃圾邮件的过滤等等。
它相比hash容器的一个优势就是,不需要存储元素的实际数据到容器中去来一个个的比较是否存在。
只需要对应的位段来标记是否存在就行了,所以想当节省内存,特别适合海量的数据处理。并且由于省去了存储元素和比较操作,所以性能也比基于hash容器的高了很多。
但是由于bloom filter没有去比较元素,只通过多个hash来判断唯一性,所以存在一定的hash冲突导致误判。误判率的大小由hash函数的个数、hash函数优劣、以及存储的位空间大小共同决定。
继续阅读 »
Hash一致性算法
介绍
安装
介绍
我们知道一台reids机器最大内存是有上限的,现在随着业务的发展,现有一台redis内存不够用,这个时候我们使用n台服务器,那怎么做到key跟服务器的映射问题。
继续阅读 »
各种坑爹,我也不知道为什么:
sudo gedit etc/apt/apt.conf.d/00aptitude
最后加一行:Acquire::CompressionTypes::Order "gz";
继续阅读 »
Hash
哈希函数(散列函数)主要用于生成消息摘要(Message Digest),即将任意大小的数据映射到一个固定大小的数据。最常见的如MD5,SHA1等。
```
--------- hash function --------------
| input |---------------->| hash value |
```
在Node中,通过crypto.getHashes()可以查看所支持的哈希算法:
js
crypto.getHashes()
// => [ 'DSA', 'DSA-SHA', 'DSA-SHA1', ... ]
下面是一个MD5的例子:
```js
var hash = crypt
继续阅读 »
stl的容器库非常强大,但是为了要兼容各种元素类型,采用了模板进行泛化,这样的好处就是使用非常的方便,但是编译器会对使用到的每种类型都进行一遍实例化,用的类型太多的话不仅影响编译速度而且生成的可执行文件也很冗余。
因此,TBOX在设计容器架构的时候,引入tb_item_func_t类型,来设置容器使用的成员类型,这样在实现容器通用性的同时,也不会产生过的冗余,而且容器接口操作上,同样相当的便利。
可以先看个简单使用哈希的例子:
```c
/* 初始化hash, 哈希桶大小8
* 键:大小写敏感字符串
* 值:long整型
*/
tb_hash_map_ref_t hash = tb
继续阅读 »
新特性
增加同时等待多个进程接口
增加uuid生成器
增加hash库模块
添加__tb_deprecated__关键字以及配置选项
改进
移动部分utils接口到hash模块
重写random生成器
Bugs修复
修复stdout在vs2015以上版本的兼容性问题
修复进程参数长度限制
继续阅读 »