首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我应该使用哪种数据结构来存储散列值?

我应该使用哪种数据结构来存储散列值?
EN

Stack Overflow用户
提问于 2009-12-24 08:32:10
回答 5查看 540关注 0票数 3

我有一个要存储到磁盘上的哈希表。该列表如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<16-byte key                   > <1-byte result>
a7b4903def8764941bac7485d97e4f76 04
b859de04f2f2ff76496879bda875aecf 03
etc...

有100-500万个条目。目前我只将它们存储在一个文件中,每个条目17字节乘以条目数量。那个文件有几十兆字节。我的目标是以一种首先优化磁盘空间,然后优化查找时间的方式来存储它们。插入时间并不重要。

做这件事最好的方法是什么?我希望文件越小越好。多个文件也是可以的。帕特丽夏·特里?基数trie?

无论我得到什么好的建议,我都会去实现和测试。我会在这里发布结果,让所有人都能看到。

EN

回答 5

Stack Overflow用户

发布于 2009-12-24 09:04:55

500万条记录大约是81MB -在内存中使用数组是可以接受的。

正如你所描述的问题--它更多的是唯一键而不是散列值。尝试使用哈希表来访问值(请查看this link)。

如果有我的误解,这是真正的哈希-尝试建立第二个哈希级别以上。

哈希表也可以成功地组织在磁盘上(例如,作为单独的文件)。

加法

搜索性能好、开销小的解决方案是:

  1. 定义了哈希函数,该函数从键生成整数值。
  2. 根据此函数生成的值对文件中的记录进行排序存储文件偏移量,其中每个哈希值将启动
  3. 以查找值:

4.1。使用函数计算它的散列

4.2。查找文件中的偏移量

4.3。从文件中读取记录,从该位置开始,直到找到关键字、未达到下一个关键字的偏移量或文件结束为止。

还有一些额外的事情必须指出:

  • 散列函数必须快速才能有效
  • 散列函数必须产生线性分布值或接近
  • 散列值偏移量可以放置在分离的文件中
  • 散列值偏移量表可以在应用程序开始时顺序读取整个排序的文件时动态产生,并在步骤4.3存储在存储器中

<代码>H120。记录必须按块读取,而不是逐个读取,才能生效。理想情况下,一次将具有计算哈希的所有值读取到内存中。

你可以找到一些散列函数here的例子。

票数 3
EN

Stack Overflow用户

发布于 2009-12-24 08:40:36

这种简单的方法是否可行,并将它们存储在sqlite database中?我不认为它会变得更小,但你应该会得到非常好的查找性能,而且它很容易实现。

票数 1
EN

Stack Overflow用户

发布于 2009-12-24 08:46:42

首先-如果你想优化磁盘空间,多个文件是不可以的,因为集群大小-当你创建大小约为100字节的文件时,每个集群大小的磁盘空间会减少-例如2kB。

其次-在你的情况下,我会将所有的表存储在一个二进制文件中,简单地按键中的字节值进行ASC排序。它会给你的文件长度正好等于条目数*17,这是最小的,如果你不想使用存档,其次,你可以使用非常快速的搜索与时间~log2(entriesNumber),当你搜索关键字将文件分成两部分,并比较他们的边界上的关键字与所需的关键字。如果“边界键”较大,你需要文件的第一部分,如果较大,那么第二部分。并再次将所采取的部分分为两部分,等等。因此,您将需要大约log2(entriesNumber)读取操作来搜索单个键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1957390

复制
相关文章
解析hash(散列)数据结构
在学习完map、set这两个由红黑树构成的容器后,我们来到了这里hash,首先我们要有一个基础的认知——哈希和map与set的仅在使用时的差别区别:前者内部的元素没有序,而后者有序,其它的都相同,这里我们可以通过STL标准库对应的unordered_map和unordered_set的两个名字就能看出,那hash存在的意义在哪里?底层的数据结构又是如何实现的呢?
比特大冒险
2023/04/16
7570
解析hash(散列)数据结构
Windows - Hash散列值抓取方法
LM Hash(LAN Manager Hash)其本质是 DES 加密。在 Windows 2008 及开始之后默认禁用的是 LM Hash。
渗透攻击红队
2020/11/25
1.9K0
Windows - Hash散列值抓取方法
js数据结构与算法--散列
不扯淡了,还是来学技术吧。 散列,是一种常用的数据存储技术,优势在于可以快速的插入或取出,使用它的数据结构,叫散列表。 它的优势哈,插入、删除、取用数据都很快,但对于查找却效率低下。 (书上原话,我不
web前端教室
2018/02/06
1.2K0
js数据结构与算法--散列
散列/散列函数「建议收藏」
每个关键字被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。这种映射就叫做散列函数
全栈程序员站长
2022/08/28
8930
散列/散列函数「建议收藏」
数据结构之链表散列实现
2. 查询x,若散列表不含有x,输出“Not Found”,否则输出x所在的链表长度
种花家的奋斗兔
2020/11/13
4920
散列算法与散列码
一、引入 1 /** 2 * Description:新建一个类作为map的key 3 */ 4 public class Groundhog 5 { 6 protected int number; 7 8 public Groundhog(){ 9 } 10 public Groundhog(int number) 11 { 12 this.number = number; 13 } 14 15 @Overr
JMCui
2018/03/15
1.5K0
散列算法与散列码
散列
将一个元素的关键码和存储位置之间建立对应的函数关系 Hash( ), 使得每个关键码与结构中的唯一的存储位置相对应:
Rikka
2022/02/07
1.8K0
散列
选择键值,冲突的时候采取不同的策略 散列函数: 简单的散列函数: 1 int hash(const string & key,int tableSize) 2 { 3 int hashVal = 0; 4 for(int i = 0; i < key.length();++i) 5 { 6 hashVal + = key[i]; 7 } 8 return hashVal % tableSize; 9 } 比较好的散列函数: 1 int hash( c
用户1154259
2018/01/17
8140
分离链接的散列散列代码实现
散列 散列为一种用于以常数平均时间执行插入,删除和查找的技术。一般的实现方法是使通过数据的关键字可以计算出该数据所在散列中的位置,类似于Python中的字典。关于散列需要解决以下问题: 散列的关键字如何映射为一个数(索引)——散列函数 当两个关键字的散列函数结果相同时,如何解决——冲突 散列函数 散列函数为关键字->索引的函数,常用的关键字为字符串,则需要一个字符串->整数的映射关系,常见的三种散列函数为: ASCII码累加(简单) 计算前三个字符的加权和$\sum key[i] * 27^{i}$ (不太
月见樽
2018/04/27
1.5K0
散列查找和哈希查找_散列检索
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。建立了关键字与存储位置的映射关系,公式如下:
全栈程序员站长
2022/11/15
8990
关于哈希(散列)函数你应该知道的东西
无论安全从业人员用计算机做什么,有一种工具对他们每个人都很有用:加密 哈希(散列)(hash)函数。这听起来很神秘、很专业,甚至可能有点乏味,但是, 在这里,关于什么是哈希函数以及它们为什么对你很重要,我会作出一个简洁的解释。
用户8639654
2021/09/14
9540
散列冲突
概念:如果当一个元素被插入时与一个已经插入的元素散列到相同的值, 那么就会产生冲突, 这个冲突需要消除。解决这种冲突的方法有几种:本章介绍两种方法:分离链接法和开放定址法
全栈程序员站长
2022/08/27
5970
Hash散列[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/146553.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/27
6720
散列函数
散列的概念属于查找,它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,查找的期望时间为O(1)。
233333
2019/09/24
9200
散列查找
散列同顺序、链接和索引一样,是又一种数据存储方法。散列存储的方法是:以数据集合中的每个元素的关键字k为自变量,通过一种函数h(k)计算出函数值,把这个值用做一块连续存储空间(即数组或文件空间)中的元素存储位置(即下标),将该元素存储到这个下标位置上。散列存储中使用的函数h(k)被称为散列函数或哈希函数,它实现关键字到存储位置(地址)的映射(或称转换),h(k)被称为散列地址或哈希地址;使用的数组或文件空间是对数据集合进行散列存储的地址空间,所以被称为散列表或哈希表。在散列表上进行查找时,首先根据给定的关键字k,用与散列存储时使用的同一散列函数h(k)计算出散列地址,然后按此地址从散列表中取出对应的元素。
全栈程序员站长
2022/08/27
1.2K0
散列查找
Go 生成散列值 sha256.Sum256
追加: append(x,1,2) ages:=make(map[string]int)
用户5760343
2019/07/17
2.3K0
Go 生成散列值 sha256.Sum256
浅谈散列运算
“指纹”一词形象地描述了散列运算的结果。在现实生活中,两个人可能长得很像,但是他们的指纹不同,根据指纹就能对这两个人进行区分。
小蜜蜂
2019/07/24
1.1K0
浅谈散列运算
Hash(散列)冲突解决 线性探测再散列和二次探测再散列
例如  哈希函数为: H(key) =  key %13,key 为关键字,采用开放地址法中的线性探测再散列解决冲突,依次输入
用户2965768
2018/12/28
16.6K0
hash散列 introduction
hash散列是在记录的存储位置与他的关键字之间建立的对应关系f, 使得每个key都对应一个存储位置, 查找时根据key的hash去查找.
CoffeeLand
2020/03/26
5390
单向散列函数
如果你需要从国外的网站上下载一个软件,但是因为种种原因,国外的网络太慢了,下载几个G的数据几乎是不可能的。刚好国内有镜像网站,可以从国内下载数据。但是如何保证国内的镜像不是被篡改过后的呢?这个时候就需要单向散列函数了。一般来说网站会提供MD5或者SHA的值作为验证值。
程序那些事
2020/07/08
7940

相似问题

对于没有值的散列,我应该使用哪种数据结构?

62

应该使用哪种数据类型来存储散列?

10

我应该使用哪种集合类型来存储一堆散列呢?

12

我应该使用哪种密码散列方法?

11

我应该使用哪种字段类型来存储真/假值?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文