-3

我听说有人使用它们来跟踪会话变量,但我真的很想知道它们是否有很多用途以及在什么条件下使用哈希表与任何其他可以处理键值对的数据结构相比是有益的,例如字典。

例如。我听说有人将会话值放入哈希表中,然后将哈希表放入 Session 对象中。我只是想知道那有什么好处。
- 性能更高吗?- 它是否可以防止其他开发人员将同名变量放入会话中?

已编辑。

4

6 回答 6

11

就像问锤子在建造房屋时有什么用......如果你想要它简单,那么哈希表只是键/值对,它取决于你在哪里放置你的钉子:)

于 2009-06-04T10:02:07.997 回答
8

一个很难回答的问题,主要是因为您正在寻找一个与解决方案相匹配的问题,而不是相反。不过,我会投入两分钱。

会话变量本质上存储当前用户会话的信息。它们通过键访问,因此它们的行为方式与哈希表相同。它们甚至可以在幕后(部分)作为哈希表实现——我不知道。

关于会话变量需要注意的重要一点是,它们是 Web 应用程序无状态这一事实的抽象。实际发生的情况是您将一个值保存到会话中,当您返回页面时,该值保存在某个地方(通常在内存或数据库中)。下次来自该人的请求时,将重新加载该变量。

哈希表主要用于使用查找键快速访问大量对象或值。因为网络是无状态的,并且会话仅限于单个用户,所以我看不到哈希表有多大用处。如果您需要快速访问大型集合中的一条数据,那么在请求结束时存储整个哈希表并在请求开始时重新加载它只是为了快速访问某个项目不太可能是有效的资源的使用。

于 2009-06-04T10:05:50.047 回答
1

取决于哈希表的含义,例如驱动大多数网站的后端数据库在表中嵌入了多个哈希表(以索引的形式)。还会想到通过会话变量将数据分配给用户 id(或 cookie)。有很多哈希表使用的例子。

于 2009-06-04T09:59:36.940 回答
1

我目前正在开发的框架将有很多套接字请求,每个客户端一分钟。

每个套接字请求都将包含客户端的标识符,该标识符将在哈希表中存储/查找。

我选择走这条路的原因是通过 Hashtable 提供的性能灵活性,我现在可以离开 - 稍后再进行调整。

:)

于 2009-06-04T10:00:44.050 回答
1

请注意,“字典”和“哈希表”处于两个不同的抽象级别。字典是将任意类型的键映射到值的东西。哈希表是实现字典的一种方式。

请注意,有时 "hash[table]" 被用作 "dictionary" 的同义词,例如在 Perl 的 %hashes 中。

当您想要哈希表的性能特征时,您可以使用哈希表。大多数情况下,您不会在意,只会将其作为您的编程语言的实现细节。

请注意,您可以将哈希表实现为具有(摊销随机预期)O(1) 最坏情况,但许多实现并没有通过所有工作和性能开销来实现这一点。如果您的输入是加密哈希或完全随机的,您无需担心,就像您的(良好)会话令牌示例一样,因此与实现任意字典的哈希表相比,哈希表的开销可能更少。

于 2009-06-06T00:50:29.590 回答
0

尝试阅读Wikipedia 对哈希表的定义,了解如何使用它们。

本质上,哈希表是一种将特定键映射到特定值的方法。因此,对于会话变量,您可以将变量用作键,将用户 ID 用作值。这将允许您将在特定会话上执行的任何操作映射到特定用户(登录到该会话的用户)并将任何操作归因于他们。同样,维基百科有更多关于会话的信息。

于 2009-06-04T10:25:44.517 回答