【问题标题】:When does Perl "hash" the hashes?Perl 什么时候“散列”散列?
【发布时间】:2015-07-23 12:00:24
【问题描述】:

根据 perl 文档页面:

perldata

哈希是标量值的无序集合,由其关联的字符串键索引。

我会认为 perl 哈希是有序的,因为它们通常是使用数组构造的:

my %h = ("a",1,"b", 2);

如果 Perl 哈希是无序的,则需要对其进行“哈希”处理以允许访问。问题是 Perl 什么时候对哈希值进行哈希处理?

如果我们这样做:

my %h = ("1",1); #1
print $h{"1"};     #2

我假设这条线 #1 正在内部进行散列。

如果哈希是从数组构造的:

#@a = ("1", 1);
my %h = @a;

我假设对 %h 的分配正在做散列。

请确认我的假设是否正确,我似乎在互联网上的任何地方都找不到详细信息。

【问题讨论】:

  • 这可能会有所帮助:perl.com/pub/2002/10/01/hashes.html
  • ("a",1,"b", 2) 实际上是一个列表,而不是一个数组:stackoverflow.com/questions/6023821/perl-array-vs-list
  • 主要关注什么?您的问题是关于语言实现的深奥问题,似乎与使用 Perl 的任何实际问题无关。
  • @dan1111 想要准确了解解释器在程序的特定步骤中做了多少工作并非完全不切实际。
  • 关于一般问题:当我们说散列是无序时,我们并不是说您不能将一些有序数据放入散列中。我们的意思是,当您从哈希中检索条目时,您不能期望得到原始订单(或任何合理的订单)。在%h1=(a=>1,b=>2);%h2=(b=>2,a=>1); 之后,无法区分哈希值。 (注意:这并不意味着如果您执行keys %h1keys %h2,这并不意味着它们保证以相同的顺序生成密钥 - 这意味着它们可能相同或可能不是。根本没有任何保证。)

标签: perl hash


【解决方案1】:

只要将字符串用作哈希键,就会计算该字符串的哈希值。如果键是常量(例如$hash{"a"} 中的"a"),则在编译时计算其哈希值并存储在 optree 中;否则它会根据需要在运行时计算。这同样适用于分配和检索;哈希键用于查找正确的哈希元素以将值存储到其中或从中检索值。

【讨论】:

  • 那么哈希是如何存储在内存中的呢?它是否像具有 O(1) 访问时间的哈希表?还是只是一个访问时间为 O(n) 的数组?
  • @texasbruce 它是一个哈希表,因此是哈希表。还有名字。具体来说,它是一个带有链表桶的单哈希表,如果任何桶变得太大,表就会增长。我怀疑这里有一个答案可以更详细地解释结构,但我现在在手机上找不到它。
猜你喜欢
  • 1970-01-01
  • 2011-03-13
  • 2012-08-03
  • 2013-03-14
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
相关资源
最近更新 更多