首页 > 其他分享 >海量数据去重的哈希与布尔过滤器

海量数据去重的哈希与布尔过滤器

时间:2024-11-13 22:50:13浏览次数:3  
标签:hash 哈希 海量 函数 数组 key 过滤器 size

目录

散列表

hash与平衡二叉树比较:

散列表组成:

hash函数

作用:

怎么选择hash:

选择标准:

常用hash:

hash的操作:

hash冲突

产生原因

如何描述冲突程度:

解决冲突:

在合理范围内:used < size:

不在合理范围内(used > size or used < 0.1size()):

stl中散列表的实现

哪些stl使用了散列表?

stl(unordered_*)散列表实现

布隆过滤器:

 背景:

构成:

怎么操作的

要点:

应用分析:

由n和p确定m和k:

变量关系:

确定哈希函数

分布式一致的哈希:

解决的问题:分布式缓存中扩容的问题

怎么解决的

目的

避免缓存失效:

保证数据均衡:


hash的应用:

什么时候使用哈希呢?

一般情况下是判断某字符串在大量的数据中是否存在,比如

散列表

hash与平衡二叉树比较:

二叉树通过比较,结构有序,提升搜索效率

key与节点存储位置的映射古关系(无序),通过空间去换取时间

散列表组成:

hash函数(将key映射到某一个地址)

数组

hash(key) % size = index

散列表(Hash Table)是一种基于键值对的数据结构,它通过哈希函数将键('key')映射到数组中的特定索引位置,实现快速存储和查找。具体组成和原理如下:

 1. 哈希函数(Hash Function)

   - 作用:将输入的键(如字符串、整数等)转换成一个整数地址,称为哈希值。哈希值决定了这个键在数组中的存储位置。
   - 映射过程:哈希函数会对键进行某种算法处理,使得不同的键尽可能产生不同的哈希值。例如,把一个字符串键映射到一个整数值。
   
 2. 数组

   - 作用:哈希表的核心存储空间。数组的每一个元素称为“桶”(Bucket),每个桶可以存储一个或多个值。
   - 大小(size):数组的长度是有限的,因此选择合适的大小(即 'size')有助于减少哈希冲突(当不同的键映射到相同的索引)。
   - 存储方式:哈希表利用数组的索引位置来存储键值对,这样可以在 O(1) 时间内完成查找。

 3. 哈希函数映射过程

   - 通过 'hash(key) % size = index' 计算出键值对应该存放在数组中的位置。具体步骤为:
     - 首先,将 'key' 通过哈希函数转化为一个哈希值(整数)'hash(key)'。
     - 然后,用 'hash(key) % size' 对哈希值进行取模操作,以确保结果在数组范围内('[0, size-1]')。
     - 最后,得到一个数组索引 'index',将键值对存储到这个位置。
   
   例如:
   '''cpp
   int hashIndex = hash(key) % size;
   '''

 示例

假设我们有一个哈希表大小为 '10' 的数组,用来存储字符串键:

1. 选择一个哈希函数 'hash(key)',将字符串转化为整数。
2. 对数组大小 'size = 10' 进行取模:'hash(key) % 10',以确定键存储的索引。
3. 若 'key = "apple"',经过哈希函数得到整数 'hash("apple") = 38',则 '38 % 10 = 8',所以将 '"apple"' 存储在数组第 '8' 个位置上。

这样,哈希表实现了通过键快速定位值的功能。

hash函数

作用:

映射关系

怎么选择hash:
选择标准:

        计算速度快

        强随机分布性

常用hash:

        murmurhash2,cityhash,siphash

        

hash的操作:

插入和删除

本质上都是先靠搜索找到位置,然后进行相关操作

hash冲突
产生原因

哈希冲突产生的原因是不同的键经过哈希函数映射后得到了相同的数组索引,从而导致多个键试图存储到相同的位置。

如何描述冲突程度:

使用负载因子:

解决冲突:
在合理范围内:used < size:

1.链表法

2.开放寻址法:

不在合理范围内(used > size or used < 0.1size()):

当used > size():扩容 (一般情况下是翻倍扩容)

当used < 0.1 size():缩容

之后要rehash(因为size改变了)

stl中散列表的实现
哪些stl使用了散列表?

stl(unordered_*)散列表实现

为了实现迭代器,将后面具体节点串成一个单链表

布隆过滤器:

 背景:

内存有限,只想确定某个key存不存在,不想知道具体内容

       

构成:

位图 和 n个hash函数

怎么操作的

(hash(key) & bit_size = index):

查询和插入的操作是一样的

布隆过滤器只能确定某个key是否不存在,但是是否一定存在不能证明。

不支持删除操作的原因:

       在位图中每次槽位只有两种状态(0 or 1),一个槽位被设置位1状态,但不确定它被设置了多少次,也不知道被多少个key哈希映射而来以及是被具体哪个hash函数映射而来。
 

要点:

确定一个key一定不存在,可控假阳率确定存在

不能删除

根据n和p算出m和k

应用分析:

由n和p确定m和k:

https://hur.st/bloomfilter

变量关系:

为什么是哈希函数中,经常对31进行操作

当k为31,假阳率(冲突概率)最低

确定哈希函数

只用2GB内存在20亿个整数中找到出现次数最多的数

k 整数(4个字节)               

v 出现次数                       

用散列表来解决,同时用4个字节来(unit32)来存储数据,因为4个字节可表示21亿多个数字>20亿

现在一组kv要8字节,20亿组要16GB内存

所以对20亿个整数拆分成若干等份

把20亿个整数丶大文件拆分到多个文件中

目的是把相同的整数放在一个文件中

使用哈希函数,哈希函数会生成64位的整数,一方面可以对文件数取余,另一方面可以应用到散列表中

在各个文件中找出出现次数最多的值再比较就可以确定答案

分布式一致的哈希:

解决的问题:
分布式缓存中扩容的问题

(分布式缓存:缓存存储怎么优雅的扩容)

怎么解决的

固定算法

哈希偏移

增加虚拟节点:

解决了哈希偏移和是哈希迁移数据量变少

目的
避免缓存失效:

固定算法

数据迁移

保证数据均衡:

虚拟节点

标签:hash,哈希,海量,函数,数组,key,过滤器,size
From: https://blog.csdn.net/jianbaigreat/article/details/143748399

相关文章

  • 拦截器Filter(过滤器)
    拦截器也叫过滤器,拦截器就是前端和servlet之间的一个东西,可以用拦截器进行编码统一和拦截没登陆就进页面的实现Filter(Servlet包下的)那三个方法是init、doFilter、destroy,它们是生命周期init是初始化,doFilter是内容,destroy是销毁拦截没登陆的1.置web.xml方法这里的配......
  • 布隆过滤器
    了解布隆过滤器日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中);在FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接......
  • 04集合基础-哈希表
    目录1.集合类的线程安全实现1.同步包装器(SynchronizedWrappers)保证线程安全的方式2.并发集合类(ConcurrentCollections)常见的并发集合类保证线程安全的方式3.不可变集合(ImmutableCollections)2.哈希表1.高效的查找、插入和删除操作2.减少内存占用3.支持唯一......
  • 哈希算法(开散列)- 支持string(this指针指向的理解)
    一.开散列的定义闭散列(开放地址法)的缺点是线性探测和二次探测都会存在哈希冲突的问题,数据越多冲突就会越明显,导致查询数据的时间复杂度大幅度提升个人思路:创建一个指针数组,当某个位置要插入一个数据,就再创建一个数组,指针数组对应位置的指针指向此数组的首元素(数组地址),......
  • 每周算法2:数学+模拟+哈希表+栈+线性dp+贪心(简单)
    目录1.统计数字描述输入描述:输出描述: 题解2.两个数组的交集(哈希表)描述题解 3.点击消除(栈)描述输入描述:输出描述: 题解4.牛牛的快递(模拟+补充)描述输入描述:输出描述:题解 5.最小花费爬楼梯(简单线性dp)描述输入描述:输出描述:示例1题解6.数组中两......
  • 每日一题.设计相邻元素求和服务;暴力算法与哈希表的运用
    本题出自LeetCode每日一题3242,可以说比昨天的那道“每日抑题”简单不少呀,就是代码长一点,同时本题目使用了两种不同的方法,并对每一种用法进行了深度解析。本文全长5000字。题目 给你一个 nxn 的二维数组 grid,它包含范围 [0,n2-1] 内的不重复元素。实现 neighbo......
  • ShardingJDBC:轻松应对海量数据挑战
    前言在当今大数据时代,海量数据的存储和访问成为了系统设计的瓶颈。单一数据库实例往往难以承受如此巨大的负载,从而导致性能下降甚至服务崩溃。为了解决这个问题,分库分表成为了一种常见的解决方案。它将数据分散存储到多个数据库实例或表中,从而有效地提升了系统的容量和性能......
  • 布隆过滤器--详解
    抛砖引玉假设遇到这样一个问题:一个网站有20亿url存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个url,你如何快速判断该url是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出。方案一可能很多人首先想到的会是使用HashSet,因为HashSet基于Ha......
  • cmu15545-哈希表(Hash Table)
    基本概念哈希和树一样,是数据库系统中用于访问数据的方法。空间复杂度:$O(n)$时间复杂度:$O(1)~O(n)$权衡:更大的哈希空间(碰撞减少),还是更少的哈希空间(碰撞处理)?哈希函数CRC-64(1975)MurmurHash(2008)GoogleCityHash(2011)FacebookXXHash(2012)【最常用】Goo......
  • 京东面试:亿级黑名单 如何设计?亿级查重 呢?(答案含:布隆过滤器、布谷鸟过滤器)
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......