我左右为难。我有一个hashedX
字段,它是一个散列/盐析值,salt保存在mysql数据库中的同一行,这是常见的做法。
hashedX saltX
------ ------
hashed1 ssai3
hashed2 woddp
hashed3 92ofu
当我收到
inputX
时,我需要知道它是否匹配hashedX
中的任何值,例如hashed1
hashed2
或hashed3
。因此,通常我会获取我的输入,对其进行散列/加盐,并将其与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 ;