谁说Delphi没有哈希

谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比 曾经看到很多人在嚷嚷Delphi没有哈希表,这些人的动手意识姑且不论,却还有很多人以此来证明Delphi比别的语言垃圾,实在是...好,牢骚打住,转接正题。TStringList是我们常用的字符串列表类型,用法就不在这里赘述,但是,在数据其项数增多时,其搜索(主要是name/key搜索和indexof搜索)性能会急剧下降,原因是TStringList的内部存储使用了链表形式,而搜索操作使用 阅读详情

谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比

曾经看到很多人在嚷嚷Delphi没有哈希表,这些人的动手意识姑且不论,却还有很多人以此来证明Delphi比别的语言垃圾,实在是...
好,牢骚打住,转接正题。


TStringList是我们常用的字符串列表类型,用法就不在这里赘述,但是,在数据其项数增多时,其搜索(主要是name/key搜索和indexof搜索)性能会急剧下降,原因是TStringList的内部存储使用了链表形式,而搜索操作使用了循环遍历方式。
值得高兴的是,在iniFiles单元,Delphi为我们提供了THashedStringList类型,即,经过哈希处理的TStringList,它继承自TStringList,只是对搜索方法进行了优化,因此,我们完全可以放心的在大量字符串搜索的时候使用它来代替TStringList,而需要改变的只是在:=的后面用THashedStringList.create来代替TStringList.create,但其速度却提高了一个数量级。
为了显示两者间性能的差距,我写了几个简单的语句来测试他们各自的特性。


unit ufrmMainForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils,IniFiles;

type
  TForm1 = class(TForm)
    btn1: TButton;
    mmo1: TMemo;
    procedure btn1Click(Sender: TObject);
  private
    ...{ Private declarations }
  public
    procedure testTHashStringList;
    procedure testTStringList;
    ...{ Public declarations }
  end;

var
  Form1: TForm1;

 

implementation
uses DateUtils;

...{$R *.dfm}

 

procedure TForm1.btn1Click(Sender: TObject);
begin
    testTStringList;
    mmo1.Lines.Add('--------------------');
    testTHashStringList;
end;

 

procedure TForm1.testTHashStringList;
var
    hsl: THashedStringList;
  I: Integer;
  datePointer: TDateTime;
  hslTime, hslTimeC, hslTimeI: Int64;
  tempInt: Integer;
  tempstr: string ;
begin
    hslTime := 0;
    hslTimeC := 0;
    datePointer := Now();
    hsl := THashedStringList.Create();

    for I := 1 to 200000 do
    begin
        hsl.Add('string_'+IntToStr(i));
    end;
    hslTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('200000 项 THashedStringList 创建耗时:'+IntToStr(hslTime)+'毫秒');

    datePointer := Now();
    for I := 0 to 200 do
    begin
        tempInt := hsl.IndexOf('string_'+IntToStr(i*1000));
    end;
    hslTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('200 项字符串搜索 THashedStringList 耗时:'+IntToStr(hslTime)+'毫秒');

    datePointer := Now;
    for I := 1 to 200000 do
    begin
        tempstr := hsl.Strings[i -1];
    end;
    hslTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('200000 项索引搜索 THashedStringList 耗时:'+IntToStr(hslTime)+'毫秒');
    hsl.Clear;

    datePointer := Now;
    for I := 1 to 100000 do
    begin
        hsl.Insert(i-1, 'string_'+IntToStr(i));
    end;
    hslTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('100000 项 THashedStringList 随位置插入耗时:'+IntToStr(hslTime)+'毫秒');

    datePointer := Now;
    for I := 1 to 100000 do
    begin
        hsl.Insert(0, 'string_'+IntToStr(i));
    end;
    hslTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('100000 项 THashedStringList 0位置插入耗时:'+IntToStr(hslTime)+'毫秒');

end;

 

procedure TForm1.testTStringList;
var
    sl: TStringList;
  I: Integer;
  datePointer: TDateTime;
  slTime, slTimeC, slTimeI: Int64;
  tempInt: Integer;
  tempstr: string ;
begin
    slTime := 0;
    slTimeC := 0;
    datePointer := Now();
    sl := TStringList.Create;
    for I := 1 to 200000 do
    begin
        sl.Add('string_'+IntToStr(i));
    end;
    slTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('200000 项 TStringList 创建耗时:'+IntToStr(slTime)+'毫秒');

    datePointer := Now;
    for I := 0 to 200 do
    begin
        tempInt := sl.IndexOf('string_'+IntToStr(i*1000));
    end;
    slTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('200 项字符串搜索 TStringList 耗时:'+IntToStr(slTime)+'毫秒');

    datePointer := Now;
    for I := 1 to 200000 do
    begin
        tempstr := sl.Strings[i -1];
    end;
    slTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('200000 项索引搜索 TStringList 耗时:'+IntToStr(slTime)+'毫秒');
    
    datePointer := Now;
    for I := 1 to 100000 do
    begin
        sl.Insert(i-1,'string_'+IntToStr(i));
    end;

    slTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('100000 项 TStringList 随位置插入耗时:'+IntToStr(slTime)+'毫秒');

    datePointer := Now;
    for I := 1 to 100000 do
    begin
        sl.Insert(0,'string_'+IntToStr(i));
    end;

    slTime := MilliSecondsBetween(Now, datePointer);
    mmo1.Lines.Add('100000 项 TStringList 0位置插入耗时:'+IntToStr(slTime)+'毫秒');

end;

end.

 

 

编译运行程序,其运行结果:
200000 项 TStringList 创建耗时:109毫秒
200 项字符串搜索 TStringList 耗时:11514毫秒
200000 项索引搜索 TStringList 耗时:31毫秒
100000 项 TStringList 随位置插入耗时:85828毫秒
100000 项 TStringList 0位置插入耗时:148734毫秒
--------------------
200000 项 THashedStringList 创建耗时:108毫秒
200 项字符串搜索 THashedStringList 耗时:188毫秒
200000 项索引搜索 THashedStringList 耗时:15毫秒
100000 项 THashedStringList 随位置插入耗时:63毫秒
100000 项 THashedStringList 0位置插入耗时:55640毫秒
(测试环境:Windows2003  SP1  +Delphi 2006 Update 2 HotFix1-9 +1G内存 +P-D2.8G双核)

结果很明显,两者在创建的时候,性能并没有差距(之前听人说THashedStringList在增加和插入操作时会比 TStringList慢,在此并没有显示出来,不知道是不是因为THashedStringList并不是人们说的那样,在每次插入项时都做哈希操作,还请各位不吝赐教),而200 项字符串搜索(从1到2000000项匀距搜索200项)中,两者的性能竟差如此悬殊。其后的各项测试也在预料之中。
由此可见,THashedStringList能更好的代替我们常用的TStringList来工作,我们为什么要拒绝呢?
另外,iniFiles单元还提供了TStringHash,但只是对key进行了哈希操作,一般不常用。

OpenCV 图像相似度匹配之感知哈希算法 技术原理 原理参考http://www.cnblogs.com/technology/archive/2012/07/12/Perceptual-Hash-Algorithm.html    参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格式) 阅读详情

相关推荐

delphi 哈希表的简单实现案例

遇到一个需要使用键值对的小功能,原先的设计是通过读取配置文件的方式完成的,这样每一个各户需求不同,每个产品都需要进行机械的修改,使用哈希表减少了重复的操作。

Delphi实现Hash表

Hash表,其实就是一个Key对应一个Object在Delphi里最简单实现Hash的就是TStrings通过它的AddObject,IndexOf,Objects等方法可以做一个很简单的Hash表。TStrings没有排序,所以IndexOf比较慢,而它的子类TStringList具有Stored属性,设置为True之后,IndexOf是用折半查找的,效率很高。所以在Delphi里可以用Tstr

记录成长的每一步 5212

delphi哈希加密示例

delphi哈希加密示例

Delphi 中哈希表TStringHash和THashedStringList性能速度

Delphi的IniFiles单元中有两个哈希表类TStringHash和THashedStringList 【TStringHash】 优点:速度快,尤其是添加时(调用.Add)速度比THashedStringList快得多。 缺点: 1、Key只能是字符串,Value只能是数字 2、无法进行遍历 【THashedStringList】 优点:继承与TStringL

正己的专栏 5260

ss524v100 调试cvbs输出

启用视频层3 dev2 对应 layer3在vdec与vo绑定的时候(不需要经过vpss),不能绑定错误,以下是绑定的程序。

2116

TensorFlow_PyTorch实战:构建AI人工智能回归模型

回归分析是机器学习的核心任务之一,用于预测连续型目标变量(如房价、股票价格、用户留存时间等)。基础线性回归模型的数学原理与代码实现多项式回归模型的过拟合处理与正则化技巧自定义数据集加载与数据预处理流程动态图(PyTorch)与静态图(TensorFlow)的编程范式对比模型评估指标与可视化分析方法核心概念:对比两大框架的架构设计,解析回归模型核心组件数学原理:推导线性回归的假设函数、损失函数及优化算法算法实现:提供TensorFlow和PyTorch的完整代码示例项目实战。

AI天才研究院 1430

【转】谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比

http://blog.csdn.net/zhmnsw/archive/2007/01/25/1493681.aspx 曾经看到很多人在嚷嚷Delphi没有哈希表,这些人的动手意识姑且不论,却还有很多人以此来证明Delphi比别的语言垃圾,实在是...好,牢骚打住,转接正题。TStringList是我们常用的字符串列表类型,用法就不在这里赘述,但是,在数据其项数增多时,其搜索(主要

okmnji79513的专栏 2903

QSPI Flash的原理与QSPI时序的Verilog实现

本节主要是讨论QSPI(Quad SPI,四线SPI总线)的相关内容。我的开发板上有一片型号是W25Q128BV的Quad SPI Flash存储器,本文将以它为例子来说明QSPI操作的一些内容。

Go Forward Forever! 4166

关于Delphi下的哈希算法——THashedStringList用法

Delphi中的THashedStringList对象 有许多程序员都喜欢使用TStringList类作为键值存储,这是不错的用法。但是 TStringList本身只是对数据线性的存储,当数据量大时,对其检索效率极为低下。Delphi在在IniFiles 单元中定义了另一个TStringList类,采用了哈希技术存储数据,它就是THashedStringList类。下面这段代码就是摘自 IniF...

mmdev 758

20 CVPR Learning 3D Semantic Scene Graphs From 3D Indoor Reconstructions 学习笔记

3RScan是大规模真实世界的室内场景,特点是对478个自然改变的室内环境在不同的时间帧进行了1482 RGB-D scans,每一个scene都包括了一些位置被改变的物体。它和ScanNet数据集的区别主要在于ScanNet中的每一个采样环境都不相同,但是3RScan中存在采样环境相同但物体的位置不同的场景。Scene Graph Annotations 则是在3RScan的基础上给物体加入了场景图需要的关系、物体特征和类别标注,同时对3RScan进行了扩展,以此形成了场景图数据。

weixin_43508459的博客 1837

Ferry工单平台部署

ferry工单平台部署

运维求生之路 1897

md5 字符串哈希 冲突_使用Delphi计算文件或字符串的MD5哈希值

md5 字符串哈希 冲突 The MD5 Message-Digest Algorithm is a cryptographic hash function. MD5 is commonly used to check the integrity of files, like to make sure that a file has been unaltered. MD5消息摘要算法是一种加密...

cumao2792的博客 1054

基于TKVA与深度学习的量子点微型光谱仪光谱重建改进算法研究

本文提出了一种融合深度学习的改进TKVA算法(TKVA-DL),用于提升量子点微型光谱仪的光谱重建精度。该方法创新性地结合深度先验网络与注意力机制,通过自适应学习光谱隐式先验替代传统固定正则化项,并动态加权探测器响应通道。实验表明,所提方法在仿真和实测数据上均显著优于传统TKVA及主流深度学习算法,RMSE降低35%,PSNR提升4.2 dB,同时保持物理可解释性。完整MATLAB实现验证了方法的有效性与可复现性,为微型光谱仪的高精度重建提供了新思路。 关键词:量子点微型光谱仪;光谱重建;Tikhonov正

AI的内部世界的博客 85

Delphi的哈希表(一)

Delphi的哈希表(一) 哈希表是通过哈希值来访问的,通过一定的内存浪费获取检索速度,在检索项时是不需要逐一检索。在编程中有一定的好处。 unit Unit1; interface uses Windows, Messages, SysUt...

467

全网唯一OpenCyphal/UAVCAN教程(8)libcanard介绍

当Cyphal里,这个结构体代表一条完整的Cyphal消息,之后我们会根据metadata里提供的元信息,其实就是消息ID,调用对应的反序列化函数,将payload还原成具体的Cyphal消息。用于构造一个新的发送队列,原则上一个can物理接口需要分配一个发送队列,如果它们的MTU大小一致,是可以共用一条的。这个库不包含IO层,是平台无关的,意义是没有实现具体的数据收发,仅提供将发送出去的Cyphal消息转成can帧,以及将收到的can帧转成Cyphal消息。返回值是这条消息拆解成的can帧的数目。....

二进制君 2407

论文必备 - YOLOv12热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv12热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 1706

数据签名-哈希算法HMACMD5

哈希算法HMACMD5哈希算法HMACMD5实现过程签名示例 哈希算法 MD5Hash算法作用: 1:防止数据被篡改 2:防止直接看到明文 ps:在密码存储中,即使采用md5存储密码也是有可能出现安全漏洞的,比如撞库的暴力破解 3:数字签名 HMACMD5 HMACMD5 是从 MD5 哈希函数构造的一种键控哈希算法,被用作基于哈希的消息验证代码 (HMAC)。此 HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。输出的哈希值长度为 12

一叶知秋 1498

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

图像的相似度Hash算法

Hash算法有三种,分别为平均哈希算法(aHash)、感知哈希算法你(pHash)和差异哈哈希算法(dHash)。 针对以上三种的Hash算法详解见博客园文章 https://www.cnblogs.com/Kalafinaian/p/11260808.html 本文实现针对平均哈希算法; 1 平均哈希算法(aHash) 1.1 算法步骤 平均哈希算法是三种H...

aigakui4186的博客 614

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Delphi下的字符串Hash函数

有点奇怪,我在Google中查找"Delphi 字符串 Hash"居然找不到相关的Hash函数!正当我不知如何是好是,忽然想起开源的JEDI项目,这个大而全的项目虽然我极少使用,但我知道里面什么都有的。一看果然……   下面是我从JEDI里面提取出来的Hash函数: function StrHash(const SoureStr: string): Cardinal;   const    

cmx8818的博客 1819

Delphi中的哈希?

曾经看到很多人在嚷嚷Delphi没有哈希表,这些人的动手意识姑且不论,却还有很多人以此来证明Delphi比别的语言垃圾,实在是...好,牢骚打住,转接正题。TStringList是我们常用的字符串列表类型,用法就不在这里赘述,但是,在数据其项数增多时,其搜索(主要是name/key搜索和indexof搜索)性能会急剧下降,原因是TStringList的内部存储使用了链表形式,而搜索操作使用

songfuqiang的专栏 2902

Delphi THashedStringList用法

Delphi中的THashedStringList对象 Delphi在在IniFiles 单元中定义了THashedStringList类: THashedStringList = class(TStringList) private FValueHash: TStringHash; FNameHash: TStringHash; FVa...

weixin_30267697的博客 439

Delphi 中的哈希表: THashedStringList

转自万一博客 Delphi 中的哈希表: THashedStringList unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = clas...

weixin_30659829的博客 403

Delphi 中的哈希表(1): THashedStringList

unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls; type   TForm1 = class(TForm)     Button1: TButton;     Button2: TButton;

chinajobs的专栏 2184

[转]:Delphi 中的哈希表(1): THashedStringList

[转]:Delphi 中的哈希表(1): THashedStringList unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics...

189
上一篇: How can I play a wav-file from memory or BLOB-field?
下一篇: vcl源码分析方法论
iseekcode
博客等级 码龄18年 36粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值