|
当第一次听说hashes,特别是如果以前使用过某种不含hash 的程序语言仍然高产时,你可能猜想为什么有人要发明这种奇
怪的东西呢?通常的理由是,有一类问题是:某个数据集和别的数据集的关系的问题。例如,下面是一些例子:
Given name, family name
Given name(名)是key,family name(姓)为value。这需要given names(名)是唯一的,如果有两人均叫做randal,这将引
起问题。使用hash,你可以通过查看任何人的given name,而找到其对应的family name。如果使用key:tom, 将得到value:
phoenix。
Hostname, IP address
你可能已经知道,因特网上每一台主机都有一个主机名(如www.stonehence.com)和一个IP 地址(如123.45.67.89),因为
机器更擅长处理数字,但对人而言,名字更容易记忆。主机名是唯一的,因此可以将其作为key。在这种hash 中,我们可
以通过查询主机名而找到其对应的IP 地址。
IP address, hostname
你也可以按相反的顺序来处理。通常我们把IP 地址看作数字,它也是唯一的字符串,因此也可以作为hash 的key。在这种
hash 中,我们可以通过查询IP 地址来查找对应的主机名。这和上一例中的hash 是不同的:hash 是单向的,由key 到value;
没有通过查询value 来得到其key 方法。因此,上述hashes 可以看作一对hash,一个针对IP addresses(IP 地址),一个针对
hostnames(主机名)。从一个hash 表得到其对应的hash 表是很容易的,这在后面将了解到。
Word, count of number of times that word appears(此词出现的次数)
这是hash 的一种常用用法。它使用的如此普遍,因此,我们在本章中有一个相应的练习。
这里的想法是,你可能希望知道某个文件中单词出现的次数。也许在给一些文档编索引,当用户查询fred 时,将知道某个
文件提到fred 5 次,另一份文档提到fred 7 次,第三份文档没有出现fred 等等。索引的结果将告诉用户那一份文档是其所
希望的。当编制此索引的程序读入某个文档时,每当遇到fred,此文档对应fred 的value 就增1。也就是说,如果某份文档
中fred 已经出现了2 次,其value 为2,当又发现时fred,其value 增到3。如果以前没有找到fred,则其value 从undef(默
认值)变为1。
Username, number of disk blockes they are using[wasting](其使用(耗用)的磁盘块数)
系统管理员喜欢这种应用。某个系统中的usernames(用户名)是唯一的,因此可以把它们作为hash 的keys,我们可以查
询它了解到此用户的信息。
Driver’s license number, name
可能有许多人叫做John Smith,但每一个人有一个不同的驾驶证编号(driver’s license number)。这个编号是唯一的,可以作
为key,对应的名字为value。
还可以把hash 看作一个简单的数据库,其中每一个key 下面可以有一块数据。如果你的任务是关于: “查询重复的”,“唯
一的”,“交叉引用的”,“查询表”,则hash 很可能在这类应用中帮上你的忙。
|
|