我左右为难。我有一个hashedX字段,它是一个散列/盐析值,salt保存在mysql数据库中的同一行,这是常见的做法。

hashedX      saltX
------       ------
hashed1      ssai3
hashed2      woddp
hashed3      92ofu

当我收到inputX时,我需要知道它是否匹配hashedX中的任何值,例如hashed1hashed2hashed3。因此,通常我会获取我的输入,对其进行散列/加盐,并将其与hashedX的值进行比较。伪代码:
$hashed_input = hash ($input with $salt );
select * from tablename where $hashed_input is hashedX

问题是我不知道在做任何saltX之前,我甚至需要到达$hashed_input
我可以逐个查看数据库行,在输入中尝试使用salt,然后检查使用salt进行哈希/盐析的输入是否与同一行的select匹配。如果我有10万张唱片的话,我想这会非常缓慢。我不知道有多慢,因为我不擅长数据库。
有没有比选择所有行、遍历它们、使用该行的salt-to-hash输入、然后再次与db中的hash值进行比较更好的方法呢?

最佳答案

如果可能(取决于哈希公式),请为User Defined Function公式定义mysqlhash数据库端(请参见CREATE FUNCTION)。这样,您就可以在一个简单的请求中获得结果:

SELECT hashedX, saltX FROM tablename WHERE UDFhash(input, saltX) = hashedX ;

10-02 01:27