在向量数据库(如 FAISS、Milvus、Qdrant)中,Hashing Function(哈希函数 / 散列函数) 并不是用来做传统数据库那样的"精确查找"(比如把字符串变成一个唯一固定的 MD5 或 SHA 散列值),而是用来做近似最近邻搜索(ANN)中的空间压缩与快速降维。
在向量检索领域,这套技术有一个专属的名字:局部敏感哈希 (LSH, Locality-Sensitive Hashing)。
它的核心灵魂在于:让原本在多维空间中就很接近的两个向量,经过哈希函数计算后,高概率掉进同一个"哈希桶(Bucket)"里;而距离很远的向量,则掉进不同的桶里。
1. 核心碰撞逻辑:传统 Hash vs 向量 Hash
为了让你彻底看清它的本质,我们来看它们对待相似数据的态度:
| 特性 | 传统哈希函数(如 MD5 / SHA-256) | 向量哈希函数(LSH / 局部敏感哈希) |
|---|---|---|
| 对微小变化的反应 | 雪崩效应。哪怕只改动一个字母,算出来的哈希值也会天差地别(避免碰撞)。 | 保持亲近 。如果两个向量极其相似,它们算出来的哈希编码也几乎一模一样(故意碰撞)。 |
| 核心目的 | 安全加密、数据完整性校验、精确唯一寻址。 | 降维与聚类。将上千维的浮点数压缩成短二进制编码,进行百倍加速。 |
2. 向量数据库是如何用 Hashing 加速搜索的?
如果你的知识库里有 1000 万个 1536 维的 Embedding 向量,暴力去算它们之间的余弦相似度,服务器的 CPU 会直接烧满。LSH 散列函数通过以下三步实现"降维打击":
第一步:空间随机投影(Random Projection)
哈希函数会在多维空间中随机画很多条"切刀"(超平面/超直线)。
-
如果向量在切刀的左边,就记为
0; -
如果向量在切刀的右边,就记为
1。
第二步:生成特征指纹(Fingerprint / Hash Code)
如果你在空间里纵横交错地画了 64 条切刀(即使用了 64 个随机哈希函数),那么每一个高维向量就会被这 64 条刀切成一段独一无二的编码。
-
向量 A 最终变成了:
10110010...(一段 64 位的二进制无符号整数)。 -
它的本质把原本需要巨大内存的
float32数组,硬生生压缩成了几个 Bytes(字节)。
第三步:桶寻址与汉明距离(Hamming Distance)
-
建库时:拥有相同或高度相似哈希编码的向量,会被归入同一个"哈希桶"中。
-
查询时 :用户输入一句话,经过同样的哈希函数,也得到了一个编码
10110011。数据库不需要遍历全库 ,只需要去匹配跟这个编码相似的桶(通过极快的位运算计算汉明距离,即看有几位数字不同)。
速度对比 :计算两个 1536 维的浮点数距离需要上千次浮点计算;而计算两个 64 位二进制的汉明距离,在 CPU 层面只需要一条 XOR(异或)和 POPCNT(计数) 指令,耗时几乎为零。
3. 常见的高级向量哈希变体
针对不同的数学度量方式,向量数据库会采用不同的 Hashing 函数:
-
SimHash / Charikar's LSH(针对 余弦相似度 Cosine Similarity):
利用随机超平面(Random Hyperplanes)对向量进行切割。向量夹角越小,被切刀分到同侧的概率就越高。
-
MinHash(针对 杰卡德相似度 Jaccard Similarity):
常用于大规模文本去重或集合相似度计算。通过多次随机排列(Permutations)来计算两个集合交集和并集的比例。
-
p-Stable LSH(针对 欧氏距离 L2 Distance):
利用稳定分布(如正态分布)进行投影,并在投影线上划分固定宽度的格子,落在同一个格子里的向量即为同桶。
💡 极客调优视角:哈希的代价与 2026 年的现状
虽然 Hashing Function 听上去无懈可击,但你在使用向量数据库或写底层算法时,必须注意它的一个重大缺陷:精度损失(精确度不高)。
因为它是强行把多维空间拍扁到几位二进制上,必然会发生"本来不怎么像,但刚好被切刀分在了一起(False Positives)"或者"本来挺像,但恰好被一刀切两半(False Negatives)"的情况。
-
什么时候用 Hashing (LSH) :当你的数据量达到了数亿级别,且服务器的内存极度紧缺(买不起高配内存服务器),或者你对速度的要求远远大于准确率(如第一轮海选粗筛、海量图片版权去重)。
-
现代向量数据库的改良 :在 2026 年,像 FAISS、Milvus 这类框架更倾向于使用 PQ(Product Quantization,乘积量化) 或者 HNSW 图索引 来代替纯粹的 LSH。PQ 的本质也是一种高级的量化哈希(把空间切成子空间做 K-Means 聚类编码),它在压缩率和精准度之间取得了更好的平衡。