哈希表(也叫散列表)的类.通过哈希表,您可以将一个任意类型的对象同另一个任意类型的对象联系起来.可以使用下列哈希表表达式来生成哈希表.
{a=>b, ... }
通常使用Object#hash方法来计算哈希表的值,而使用Object#eql?方法来判定索引是否相同.
若用作索引的对象的内容发生了变化,且hash方法的返回值也有所不同时,将无法取出哈希表中的值.所以Array、Hash等的实例并不面向索引对象本身. 例如,若将字符串作为索引时,将先拷贝该字符串,然后把拷贝设为只读(freeze),最后将该拷贝用作索引.若想更改索引字符串的内容时,将引发TypeError异常.
哈希表的建立:
Hash[key,value,...]
Hash[hash]从数组生成哈希表的方法示例(可能您觉得应该有更直接的方法,但实际上并没有)
1.由[索引, 值, ...] 型的数组变为哈希表
ary = [1,"a", 2,"b", 3,"c"]
p Hash[*ary]
# => {1=>"a", 2=>"b", 3=>"c"}
2.由索引和值配对出现的数组变为哈希表
alist = [[1,"a"], [2,"b"], [3,"c"]]
p Hash[*alist.flatten]
#=> {1=>"a", 2=>"b", 3=>"c"}
3.由索引数组和值数组配对生成哈希表(version 1.7 以后)
keys = [1, 2, 3]
vals = ["a", "b", "c"]
alist = keys.zip(vals) # 或 alist = [keys,vals].transpose
p Hash[*alist.flatten]
#=> {1=>"a", 2=>"b", 3=>"c"}
4.虽然索引和值都是数组,但还是无法使用(2)或(3)的方法时,只好老老实实地赋值了
h = Hash.new
alist = [[1,["a"]], [2,["b"]], [3,["c"]]]
alist.each {|k,v|
h[k] = v
}
p h
#=> {1=>["a"], 2=>["b"], 3=>["c"]}
Hash.new([ifnone])
Hash.new {|hash, key| ...} ((<ruby 1.7 特性>))
生成一个全新的空哈希表.若索引没有对应值时,其默认值为ifnone.您必须谨慎地处理默认值的问题(trap::Hash).
ruby 1.7 特性:若指定了块时,则块的计算值将成为默认值.每当调用无值的哈希表元素时,都会对块进行计算,然后返回其结果.而调用哈希表时的索引将被传递给该块.
# 若没有使用块时, 一旦改变默认值将会
# 影响到其他的值
h = Hash.new("foo")
p h[1] # => "foo"
p h[1] << "bar" # => "foobar"
p h[1] # => "foobar"
p h[2] # => "foobar"
# 若使用块的话,问题便会迎刃而解
h = Hash.new {|hash, key| hash[key] = "foo"}
p h[1] # => "foo"
p h[1] << "bar" # => "foobar"
p h[1] # => "foobar"
p h[2] # => "foo"
# 若元素无值时,可以(像fetch一样)抛出异常
h = Hash.new {|hash, key|
raise(IndexError, "hash[#{key}] has no value")
}
h[1]
# => hash[1] has no value (IndexError
分享到:
相关推荐
RS Hash(Reed-Solomon)由Bob Jenkins提出,使用两个常数a和b进行迭代更新。初始时,哈希值和乘法因子均为0,每次迭代都将当前字符与哈希值乘以a的积加入到哈希值中,并更新a为a*b。这个过程直到字符串结束,最后...
### 打造最快的Hash表(和Blizzard的对话) #### Hash表基础知识与应用场景 本文将深入探讨如何构建高效的Hash表,并特别关注Blizzard在游戏开发过程中所采用的技术。Hash表是一种利用散列函数来实现快速查找的数据...
总结文档`hash表.doc`和`hash总结.doc`可能涵盖了哈希表的基本概念、原理、哈希函数的设计、冲突解决策略以及哈希表在实际应用中的案例分析。深入阅读这些文档将有助于进一步理解哈希表的工作机制及其在软件开发中的...
### C语言实现Hash表知识点详解 #### 一、Hash表概念与原理 Hash表是一种根据键值(Key value)来直接访问内存存储位置的数据结构。通过一个哈希函数(Hash function),可以将任意长度的键值映射为一个固定长度的...
总结,三维Hashin失效准则是评估多向复合材料失效的重要工具,它通过综合考虑多种失效模式,提供了一种全面而精确的失效分析方法。在实际工程问题中,利用三维Hashin准则进行失效模拟,可以有效预测材料的承载能力和...
在决定是否使用Hash Join时,CBO会评估其成本,包括构建哈希表所需的内存、分区和扫描的I/O成本等。如果Hash Join的成本低于其他类型的Join操作,比如Nested Loop或Sort Merge Join,那么CBO会选择Hash Join。 总结...
总结起来,`hash_map`是C++中一种高效的key-value存储容器,其性能优于`map`,尤其是在大数据量和频繁查找的场景下。虽然它不被标准库支持,但在许多第三方STL实现中可以找到。正确地选择和使用`hash_map`,能够显著...
其中特别推荐了FNV1算法,该算法不仅计算效率高,而且具有良好的散列质量,非常适合在网络通信等场景中使用。对于不同的应用场景,可以根据实际需求选择合适的Hash算法,以满足性能和安全性的双重需求。
总结来说,Java中的Geohash工具类是Android开发中的强大工具,它简化了地理位置数据的处理,提高了查询效率,同时降低了存储和计算的复杂性。通过学习和利用`davidmoten-geo-686c651`这样的库,开发者可以轻松地集成...
总结来说,hash包为R语言用户提供了一种强大的数据结构,从而使得R能够更有效地处理关联数组或字典类型的数据。通过提供类似哈希表的数据结构,用户能够利用R语言的特性,如更优的对象访问性能,进行更高级的数据...
针对包含大量数据的表,特别是那些涉及长字符串搜索的情况,使用`hash关键字`或`hash桶`的方法可以显著提升性能。本文将详细介绍如何通过构建hash关键字来优化SQL Server应用程序,特别是如何利用`hash`技术来改进...
总结起来,查看签名KeyHash是Android应用发布过程中的关键步骤,尤其在64位系统下,使用Keytool工具配合openssl可以快速获取。记住,每个应用都应该有自己的KeyHash,并且在不同的发布渠道可能需要配置不同的KeyHash...
总结来说,aHash算法是一种快速且简单的图像相似度比较方法,特别适合于大量图像的预筛选。在Delphi中实现aHash,需要理解算法的基本流程,并能够利用Delphi的图像处理和二进制操作功能。通过这个压缩包,你可以学习...
在IT领域,哈希(Hash)函数是一...总结起来,"hashString"项目涉及了C++中哈希表和自定义哈希函数的实现,特别是针对字符串的加密处理。理解和掌握哈希函数的原理及应用,对于提升程序性能和处理大数据具有重要意义。
这就引出了哈希表(hash table)的概念——一种能够实现近似常数时间复杂度O(1)操作的数据结构。在C++ STL中,`hash_map`正是用来实现这种高效键值对存储的数据结构。 #### 1. 数据结构:hash_map原理 `hash_map`的...
hash_set c++总结(自定义类型stuct、class)。总结自定义struct、class三个案例。find函数测试,hash_set迭代器。
总结来说,哈希冲突的解决方案主要涉及哈希函数的设计、冲突处理机制(如链地址法和开放寻址法)以及对哈希表大小的优化。在实际应用中,我们需要根据具体需求和性能指标来选择合适的方法。在字符串查找问题中,哈希...
根据给定的文件信息,我们可以总结出以下关于 Hash 函数在 C 语言中的实现与应用的知识点: ### 1. Hash 函数的概念 哈希函数(Hash Function)是一种将任意长度的消息映射到固定长度的消息摘要的一种算法。这种...
总结来说,`nginx_upstream_hash-0.3.1`是一个强大的工具,它使得Nginx能更好地适应各种负载均衡策略,特别是对会话持久化有需求的场景。正确理解和运用这个模块,可以显著提升服务的稳定性和用户体验。
总结起来,C/OC中的Geohash实现涉及到编码和解码算法的设计,以及如何在实际场景中利用这一技术提高地理数据处理的效率。无论是C语言的简洁高效,还是Objective-C的面向对象特性,都能为Geohash的应用提供有力的支持...