在 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 冲突,索引将失败。不知道该怎么办...
假设我们有这个 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 冲突,索引将失败。不知道该怎么办...