使用HASH技术进行排重优化的案例

【算法·哈希】哈希Hash判重算法入门 大整数判重 对于一个大整数,如果你需要判重,即知道一个数字是否已经出现过,如果这一个数值很小的话,我们可以直接用数组进行桶排,暴力用数组下标标记,这样十分简单的就能够知道一个数字是否已经出现过了。 但是如果一个数字的数值非常大,超出了数组所能够承受的空间大小,我们就需要使用Hash来进行解决。 对于一个数值,对它进行一大大整数取模,这一个取模的值就是这一个数字的哈希值。即:Hash[x]=x&nb... 阅读详情
create table test_key(pk varchar(32),         key1 varchar(20),        key2 varchar(20), 
        key3 varchar(20),         key4 varchar(20),         key5 varchar(20),         key6 varchar(20), 
        key7 varchar(20),         key8 varchar(20),         key9 varchar(20),         key10 varchar(20),
        key11 varchar(20),        key12 varchar(20),        key13 varchar(20),        key14 varchar(20),
        key15 varchar(20),        key16 varchar(20),        key17 varchar(20),        key18 varchar(20),
        key19 varchar(20),        key20 varchar(20))
                
业务需求:
检查指定key1~key20值的记录是否已经存在,如存在返回其pk,否则插入新值

sql如:
Select pk from test_key         
  where key2='key_value' and key1 = 'key_value'
        and key3 = 'key_value'        and key4 = 'key_value'        and key5 = 'key_value'        and key6 = 'key_value'
        and key7 = 'key_value'        and key8 = 'key_value'        and key9 = 'key_value'        and key10 = 'key_value'
        and key11 = 'key_value'        and key12 = 'key_value'        and key13 = 'key_value'        and key14 = 'key_value'
        and key15 = 'key_value'        and key16 = 'key_value'        and key17 = 'key_value'        and key18 = 'key_value'
        and key19 = 'key_value'        and key20 = 'key_value'        
很可能对于任意key来说其选择性都不是很强,但是20个key的组合却是唯一的
如此结构非常不利于索引优化

针对这一应用可以考虑将key1~key20合并成一个字段key_conn,并建立索引
如增加字段Key_conn varchar(400)
如此一来表变大了近一倍

于是想到使用hash减少列大小
例如增加Key_conn varchar(16)
并将源数据通过md5转换为16位后再插入

测试如下:

构建test_key数据:
declare
        i int :=1;
    begin
        for i in 1..200000 loop
insert into test_key  (pk,key1        ,
Key2        ,key3        ,key4        ,key5        ,
key6        ,key7        ,key8        ,key9        ,key10        ,key11        ,key12        ,key13        ,key14        ,
key15        ,key16        ,key17        ,key18        ,key19        ,key20        ) 
values(SYS_GUID(),
dbms_random.string('a',20),dbms_random.string('a',20),
dbms_random.string('a',20),dbms_random.string('a',20),
dbms_random.string('a',20),dbms_random.string('a',20),
dbms_random.string('a',20),dbms_random.string('a',20),
dbms_random.string('a',20),dbms_random.string('a',20),
dbms_random.string('a',20),dbms_random.string('a',20),
dbms_random.string('a',20),dbms_random.string('a',20),
dbms_random.string('a',20),dbms_random.string('a',20),
dbms_random.string('a',20),dbms_random.string('a',20),
dbms_random.string('a',20),dbms_random.string('a',20));
  end loop; 
    commit;
    end; 
    
构建合并字段的表:

create table test_merge(pk varchar(32), 
        key1 varchar(20),        key2 varchar(20), 
        key3 varchar(20),        key4 varchar(20), 
        key5 varchar(20),        key6 varchar(20), 
        key7 varchar(20),        key8 varchar(20), 
        key9 varchar(20),        key10 varchar(20),
        key11 varchar(20),        key12 varchar(20),
        key13 varchar(20),        key14 varchar(20),
        key15 varchar(20),        key16 varchar(20),
        key17 varchar(20),        key18 varchar(20),
        key19 varchar(20),        key20 varchar(20),
        Key_conn varchar(16)
        )

构建合并函数:
CREATE OR REPLACE FUNCTION merge_to_md5(
inputstr IN VARCHAR2)
RETURN VARCHAR2
IS
retval varchar2(16);
BEGIN
retval := (DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => inputstr)) ;
RETURN retval;
END;


将源数据转换为合并数据:
Insert into test_merge
select pk,key1        ,Key2        ,key3        ,
key4        ,key5        ,key6        ,key7        ,
key8        ,key9        ,key10        ,key11        ,
key12        ,key13        ,key14        ,key15        ,
key16        ,key17        ,key18        ,key19        ,key20        ,
merge_to_md5(key1||key2||key3||key4||key5||key6||key7||key8||key9||key10||key11||key12||key13||key14||key15||key16||key17||key18||key19||key20
) from test_key

更新统计信息:
SQL> exec sys.dbms_stats.gather_table_stats(null,tabname => 'test_key',estimate_percent => 100);

PL/SQL procedure successfully completed

SQL> exec sys.dbms_stats.gather_table_stats(null,tabname => 'test_merge',estimate_percent => 100);

PL/SQL procedure successfully completed

对比数据情况:
SQL> select segment_name,blocks,bytes from user_segments where segment_name in ('TEST_KEY','TEST_MERGE');

SEGMENT_NAME                                                                         BLOCKS      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST_KEY                                                                              14336  117440512
TEST_MERGE                                                                            14336  117440512

SQL> select count(*) from test_merge
  2  ;

  COUNT(*)
----------
    200000

重复数据情况:
SQL> select count(*),key_conn from test_merge where key_conn is not null group by key_conn having count(*) >1;

  COUNT(*) KEY_CONN
---------- ----------------

无重复数据


从测试的情况看,Key_conn字段基本无重复,但md5并不能排除其重复的可能性,因此并不能直接Key_conn来替换pk字段,查询时也不能直接用
Select pk from test_merge where key_conn='key_value'
来替换,但使用
Select pk from test_merge 
        where  
        key1 = 'key_value' and key2 = 'key_value'        and key3 = 'key_value'        and key4 = 'key_value'
        and key5 = 'key_value'        and key6 = 'key_value'        and key7 = 'key_value'        and key8 = 'key_value'
        and key9 = 'key_value'        and key10 = 'key_value'        and key11 = 'key_value'        and key12 = 'key_value'
        and key13 = 'key_value'        and key14 = 'key_value'        and key15 = 'key_value'        and key16 = 'key_value'
        and key17 = 'key_value'        and key18 = 'key_value'        and key19 = 'key_value'        and key20 = 'key_value'
        and        key_conn= merge_to_md5(key_value_merge)

利用key_conn上的索引定位到几乎唯一行再进行filter即可

转:http://blog.itpub.net/27378/viewspace-610587


「 分布式技术 」一致性哈希算法(Hash)详解 在分布式系统中,数据的存储和访问是很重要的问题。为了提高系统的可用性和扩展性,常常需要将数据分布到不同的节点上,而且这些节点也可能会动态地加入或离开集群。一致性哈希算法就是一种常用的解决方案,它可以解决节点的动态变化和负载均衡的问题。本文将深入探讨一致性哈希算法的底层原理,包括其基本思想、关键步骤以及优缺点等,同时结合实际场景进行举例说明。一致性哈希算法是一种用于分布式系统中的数据分片和负载均衡的算法。它将整个哈希空间划分为一个环,并且每个节点在这个环上都有一个对应的位置。 阅读详情

相关推荐

【C++语言】精妙的哈希算法:原理、实现与优化

哈希算法是一种将任意长度输入映射为固定长度输出的算法,广泛应用于数据检索、加密、缓存等领域。本文首先介绍了C++中常用的哈希函数,包括MD5和SHA-256,并讨论了哈希冲突的解决方法,如开放寻址法和链地址法。随后,本文探讨了哈希算法的优化策略,如选择合适的哈希函数、动态扩展哈希表、减少哈希冲突以及缓存优化等。最后,本文列举了哈希算法在数据库索引、缓存系统、密码学和文件校验等实际应用中的案例。本文旨在帮助读者深入理解并应用哈希算法,提高系统效率。

一个被知识诅咒的人 2669

一则使用HASH技术进行优化的案例

表结构:create table test_key(pk varchar(32), key1 varchar(20), key2 varchar(20), key3 varchar(...

cujiaowu9180的博客 151

哈希表与哈希算法:原理、实现与优化

哈希表(Hash Table)是一种基于键值对(key-value)存储数据的数据结构,它通过计算键的哈希值来确定数据在内存中的存储位置,从而实现O(1)平均时间复杂度的插入、查找和删除操作。

刘念卿的博客 1647

Python数据分析库pandas高级接口dt和str的使用

Series对象和DataFrame的列数据提供了cat、dt、str三种属性接口(accessors),分别对应分类数据、日期时间数据和字符串数据,通过这几个接口可以快速实现特定的功能,...

董付国的Python专栏 1253

数据结构与算法:哈希算法的存储优化技巧

哈希算法在计算机科学领域有着广泛的应用,如数据库索引、缓存系统、密码学等。然而,随着数据量的不断增长,哈希算法的存储效率成为了一个关键问题。本文的目的在于深入探讨哈希算法的存储优化技巧,帮助开发者在实际应用中更高效地使用哈希算法。范围涵盖了常见的哈希算法类型、存储优化的方法和策略,以及相关的实际应用场景。本文将按照以下结构展开:首先介绍哈希算法的核心概念与联系,包括哈希函数、哈希表等;接着详细讲解核心算法原理和具体操作步骤,并使用Python代码进行阐述;然后介绍哈希算法的数学模型和公式,并举例说明;

AI 算法实战派 995

什么是哈希(Hsah)算法,哈希算法的作用以及Java中常见的哈希算法的使用案例。

使用静态方法MessageDigest.getInstance()获取消息摘要对象,传入需要使用的算法模型。

2301_77852117的博客 1861

用哈希算法的思想解决排序和字符串去重问题,时间复杂度为O(N)

第一个题目: int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N)  我们所知道的常规排序中,最优的解法也就是O(N*log2^N),那如何做到时间复杂度为O(N)呢? 运用哈希算法的思想就可以优化算法为O(N) void Sort(int* a, int n) { assert(a); con

ChaseRaod的博客 5232

深入解析 Whirlpool 哈希算法及 Python 实现

Whirlpool是一种基于区块加密的密码哈希函数,由 Vincent Rijmen(AES 的设计者之一)和 Paulo Barreto 提出。输出长度固定为512 位。基于增强的Miyaguchi–Preneel 构造。使用64 位字进行高效计算。本文详细讲解了 Whirlpool 算法的原理与 Python 实现,展示了单次加密、批量验证和多算法支持的完整案例,并结合设计模式(工厂模式、策略模式、模板方法模式)提升了代码灵活性和可扩展性。这些实践提供了开发高效哈希算法系统的宝贵经验。

闲人编程的博客 1912

利用文件哈希值进行排重的Python脚本

下载了些图片,里面有少量重复的。写了个脚本,给每个文件算SHA-256,哈希值重复的就删掉。 import re, sys, os, hashlib folder = 'C:\\XXX\\'; dicFile = {} n = 0; for filename in sorted(os.listdir(folder)): path = folder + filename; sig

CodeArhat的专栏 2443

Redis一致性哈希算法和哈希槽区别

一致性哈希算法和哈希槽(Hash Slot)都是在分布式系统中用于数据分片和节点映射的技术,主要应用于像 Redis 集群这样需要将数据分散存储在多个节点的场景。一致性哈希是在哈希取余算法基础之上优化的,分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不对了。用于解决分布式缓存系统中的数据选择节点存储问题和数据选择节点读取问题以及在增删节点后减少数据缓存的消失范畴,防止雪崩的发生。

技术博客 1721

Python-PIL与感知哈希算法实现图像去重

PIL库的安装相对简单,可以通过Python包管理器pip来完成。确保你安装的是Pillow,这是PIL库的友好分支版本。可以通过以下命令安装:安装完毕后,可以在Python脚本中导入并使用PIL库:# 使用PIL库加载和显示图像感知哈希算法,也称为感知性散列算法或图像哈希算法,是一种用于图像内容识别和比较的计算机技术。它源于对传统哈希算法在图像处理领域应用的改进。传统哈希算法通常用于确定数据的完整性或在大规模数据集中快速识别相同或相似的文件。

weixin_31869917的博客 1067

Czkawka哈希算法:文件去重核心技术的选择与优化

在数字时代,用户设备中积累了大量重复文件,这不仅浪费存储空间,还增加了管理复杂度。Czkawka作为一款高效的跨平台重复文件查找工具,其核心能力建立在精密的哈希算法体系之上。本文将深入探讨Czkawka如何通过智能的哈希算法选择和优化策略,实现高效准确的文件去重。 ## 哈希算法架构概览 Czkawka采用多层次的哈希算法架构,针对不同场景和性能需求提供灵活的算法选择: ```mermaid...

gitblog_01151的博客 1020

Python数据可视化分析库-Matplotlib

课程分享——Python数据可视化分析库-Matplotlib,附课件、代码。 Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。这里将会探索 matplotlib 的常见用法。通过本门课程的学习,可以应付后续机器学习课程中的绝大多数应用,建议掌握本部分的内容

Java中的哈希算法优化:如何处理大规模数据的去重与查找

哈希函数将输入值映射到表中的一个位置,理想情况下,不同的输入会映射到不同的位置。然而,随着数据量的增加,如何在Java中优化哈希算法的实现,保证其高效性和扩展性,成为了关键问题。通过优化哈希函数、合理设置哈希表的容量与负载因子,以及使用布隆过滤器等高级算法,可以有效提高Java中的哈希算法性能,尤其是在处理大规模数据的去重与查找时。每个哈希表的桶中存储的是一个链表,当发生冲突时,冲突的元素会被添加到相应桶的链表中。在这个例子中,通过设置初始容量和负载因子,我们可以减少扩容的频率,提高哈希表的性能。

微赚淘客系统开发者博客 1290

Windows系统下搭建MPI(并行计算)环境

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!                 W

weixin_43417960的博客 5752

Amber分子动力学模拟:蛋白结构准备全流程与关键注意事项

分子动力学模拟是研究蛋白结构、配体结合与构象变化的重要计算手段,其结果的可靠性高度依赖初始结构的质量。在Amber模拟体系中,结构准备是决定后续计算成败的“一票否决”环节,任何缺失残基、错误质子化状态或未处理的二硫键都可能让长时程模拟失去意义。从PDB原始文件出发,需依次完成结构检查与清洗、残基命名统一、配体参数化、金属离子建模、加氢及质子化状态判断,最后通过tleap构建力场、溶剂盒子与离子环境。这一过程看似琐碎,却直接决定了蛋白在模拟中的物理合理性。无论是解析催化机制、评估药物结合亲和力,还是探索构象变

weixin_31714129的博客 240

Deep哈希算法介绍

微信公众号:深度学习大讲堂 作者:程程 链接:https://zhuanlan.zhihu.com/p/21396173 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 前言 在最近邻搜索(nearest neighbor search)问题中,给定一个查询(query),目标是要找到空间中离它最近的点。这里所说的空间可以是任意的空间,比如特征

LeeWei4939的博客 1万+

滑模控制理论(SMC)概述

滑模控制理论(SMC)概述一、背景二、数学理论三、高维拓展四、分析 一、背景 滑模控制理论(Sliding Mode Control, SMC)是一种建立在现代控制理论基础上的控制理论,主要数学核心为李雅普诺夫函数。 滑模控制的核心思想是建立一个滑模面,将被控系统拉取到滑模面上来,使系统沿着滑模面运动。滑模控制的一个优势是无视外部扰动和不确定参数,采用一种比较“暴力”的方式达到控制的目的。 其思想和反步法有些类似,但数学实现起来更加方便而不抽象。相比反步法,滑模控制没有复杂的数学计算,也不会出现“微分爆炸”

高能阿博特的博客 6万+

哈希算法简介

哈希算法 RToax 2020年9月 哈希算法(Hash 算法,Hash 算式,散列算法,消息摘要算法) 1. 什么是哈希算法 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。 2. 哈希算法的特点 哈希表是根据设定的

RToax 3554

Altium Designer系列: 软件系统参数配置保存

【Altium Designer实践】 软件系统参数配置保存 作者 CodeAllen ,转载请注明出处 目录设置中文菜单高亮模式设置文件关联pcb设置布线设置保存配置文件(复用) 设置中文菜单 DXP->Preferences 高亮模式设置 文件关联 pcb设置 布线设置 保存配置文件(复用) ......

CodeAllen嵌入式 2019

【学习系列】SAP RAP 8:行为定义-Authorization Control

本文介绍了SAP RAP中的授权控制实现方法,主要分为读取操作和修改操作两种场景。读取操作通过ABAP CDS的数据控制语言(DCL)实现,使用访问控制对象限制数据可见范围;修改操作则通过行为定义中的权限检查,包括全局授权、实例授权和预检查三种方式。文章详细说明了如何使用DCL创建访问控制规则,并通过实例演示了全局授权和实例授权的代码实现方法,以及预检查功能在数据更新前的权限验证。这些授权控制机制共同确保用户只能访问和操作其权限范围内的数据,有效保障系统安全性。

DeveloperMrMeng的博客 437

字符串哈希算法

哈希算法 字符串的哈希算法,通俗的理解,就是将一个字符串,转化成整数 原来我们进行字符串匹配的时候,就是一个个去匹配,那么时间复杂度是o(n),如果转化成数字,去匹配那么时间复杂度会变成o(1)。 哈希算法的引入 首先联想一下二进制数,对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): 1101101=1 * 2 ^ 6+1 * 2 ^ 5+0 * 2 ^ ...

a921893396的博客 5737

【2025CSPJ普及组】T4. 多边形

【2025CSPJ普及组】T4. 多边形【题目描述】小 R 喜欢玩小木棍。小 R 有 n 根小木棍,第i(1≤i≤n) 根小木棍的长度为 ai。

lybc2019的博客 849

不用10分钟,快速理解哈希(Hash),哈希算法,哈希表

哈希是一种能将任意长度的数据输入转化为固定长度值的过程,这个固定长度的输出值被称为哈希值或者摘要。无论原始数据有多长,哈希值的长度都是固定的。

2402_89254607的博客 1437

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3648

手把手保姆级|Python爬取微信公众号文章完整版,反反爬策略拉满,附可运行完整代码(永久可用)

做Python爬虫的朋友都知道,爬取微信公众号文章 绝对是爬虫领域的「香饽饽」也是「硬骨头」。一方面,微信公众号的文章是极具价值的数据源:不管是自媒体从业者做竞品分析、新媒体运营者整理干货、还是个人学习收集资料,都需要批量爬取公众号文章;另一方面,微信的反爬机制堪称全网最严苛之一 ——腾讯对微信生态的风控做到了极致,动态渲染页面、高频IP封禁、Cookie短时效失效、请求头严格校验、自动化工具秒识别、频繁请求直接拉黑,这些反爬手段让90%的爬虫新手望而却步:要么爬了几篇就被封IP,要么Cookie失效爬取中

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2628
上一篇: linux大内存页 HugePages on Linux
下一篇: 如何知道ASM磁盘组由哪些物理磁盘组成
常飞梦
常飞梦 领域专家: 数据库技术领域 领域专家: 数据库技术领域
博客等级 码龄21年 403粉丝 314原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值