在 SQL 服务器中使用 MD5 进行索引

Indexing with MD5 in SQL Server

假设我们有这个 table

ID | MAIL
1  | no@gmail.com
2  | yes@gmail.com
3  | anything@gmail.com

你明白了…… 我现在想查询这个 table 并且我收到 MAIL 列值的 MD5 散列作为输入。 所以我的查询看起来像这样:

SELECT * FROM TABLE 
WHERE HashBytes('MD5', MAIL ) = 'CE42C51D0B63DF9F616CCFB4C3FCF16C'

现在想象这个 table 是一个非常大的 table,成千上万的记录。我的查询变得非常慢。我现在要做的是添加一个索引,但是使用 MD5。我读到它可以在 PostgreSQL 上使用这样的东西来完成:

CREATE INDEX mail_md5 ON TABLE(DECODE(MD5(MAIL), 'HEX'))

我可以在 SQL 服务器中做类似的事情吗?

注意:我无法添加具有哈希值的另一列:(

注意 2:我知道 HASH 是不可逆函数,PostgreSQL 索引的示例是从 here

复制的

我不确定您可以在模式方面做什么,但是如果您可以修改模式,那么 SQL 服务器有一个叫做 Indexed Views 的东西,它们是存储在内存(与动态计算相比)。

您可以查询视图而不是底层 table,SQL 服务器会为您保持最新。关键短语是 WITH SCHEMABINDING,它告诉 SQL 服务器将计算字段保存在内存中。

例如:

CREATE VIEW HashedAddresses
WITH SCHEMABINDING
AS
SELECT ID, MAIL, HASHBYTES('MD5',MAIL) as HashedMailMD5 from myschema.mytable;

然后你可以在你的哈希字段上创建一个unique聚簇索引:

CREATE UNIQUE CLUSTERED INDEX IndexHashedAddresses ON HashedAddresses(HashedMailMD5);

之后这应该很快:

SELECT ID FROM HashedAddresses WHERE HashedMailMD5 = '0x121....'

问题:如果遇到 MD5 冲突,索引将失败。不知道该怎么办...