在 kdb 中的字典中散列

Hashing in dictionary in kdb

当我们阅读 Q for Mortals(词典部分)时,有这样的描述:
当您知道键是唯一的时,您可以将 `u# 属性应用于键。这将有效地使字典成为散列table,并伴随着默认线性查找的查找速度的提高。

谁能告诉我这本字典是如何在幕后转换为散列的table?

正如我们所知,在 Java 中维护了一个包含 16 个桶的数组用于哈希 table 和一个哈希函数生成位置并将元素放置在该桶中,并且 linkedlist/tree 在发生碰撞时保持不变。

只是想了解从字典到散列的转换table 在 kdb 中是如何完成的?

实际上将唯一属性应用于键可以使搜索方式更快。

Eg:
q)a:(`u#asc -100000?`6)!100000?10 / hashtable
q)b:(-100000?`6)!100000?10

// Searching elements in dictionary which is converted to hashtable
q)\t:100000 a[(key a)[1021]]
24
q)\t:100000 a[(key a)[2231]]
25
q)\t:100000 a[(key a)[72461]]
24
q)\t:100000 a[(key a)[89985]]
24

//Searching elements in dictionary which is not converted to hashtable
q)\t:100000 b[(key b)[1021]]
51
q)\t:100000 b[(key b)[2231]]
90
q)\t:100000 b[(key b)[72461]]
2642
q)\t:100000 b[(key b)[89985]]
3280

哈希 table 的创建不会向用户公开,因此您不太可能了解它是如何在幕后完成的。此外,散列 table 不是从字典中创建的,它只是为构成字典键的列表创建的。

您的字典查找需要查找键(列表)- u# 属性通过不默认使用线性搜索来加快对所述列表的搜索。

这里有一些信息:http://www.timestored.com/kdb-guides/table-attributes#unique-attribute