hash函数编辑
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
哈希索引
SQL Server 2014
<?XML:NAMESPACE PREFIX = "[default] http://www.w3.org/1999/xhtml" NS = "http://www.w3.org/1999/xhtml" />索引用作内存优化表的入口点。 从表读取行需要借助索引在内存中定位数据。
哈希索引包含以数组形式组织的 Bucket 集合。 哈希函数将索引键映射到哈希索引中对应的 Bucket。 下图展示映射到哈希索引中三个不同 Bucket 的三个索引键。 出于演示目的,哈希函数的名称为 f(x)。
用于哈希索引的哈希函数具有以下特征:
-
SQL Server 拥有一个用于所有哈希索引的哈希函数。
-
哈希函数具有确定性。 同一索引键始终映射到哈希索引中的同一 Bucket。
-
多个索引键可能映射到同一个哈希 Bucket。
-
哈希函数经过均衡处理,这意味着索引键值在哈希桶上的分布通常符合泊松分布。
泊松分布并非均匀分布。 索引键值并非均匀地分布在哈希 Bucket中。 例如,n 个不同索引键在 n 个哈希桶上的泊松分布导致约三分之一为空桶,三分之一的桶包含一个索引键,另外三分之一包含两个索引键。 少量 Bucket 将包含两个以上的键。
如果两个索引键映射到同一个哈希 Bucket,则产生哈希冲突。 大量哈希冲突可影响读取操作的性能。
内存哈希索引结构包含一个内存指针数组。 每个 Bucket 映射到该数组中的一个偏移位置。 数组中的每个 Bucket 指向该哈希 Bucket 中的第一行。 Bucket 中的每行指向下行,因而形成了每个哈希 Bucket 的行链,如下图所示。
该图有三个包含行的 Bucket。 顶部的第二个 Bucket 包含三个红色行。 第四个 Bucket 包含一个蓝色行。 底部的 Bucket 包含两个绿色行。 这些可能是同一行的不同版本。
有关内存优化表的索引的详细信息,请参阅在内存优化表上使用索引的指导原则。