我感到两难.我有一个hashedX字段,它是一个哈希值/盐值,盐通常按照惯例保存在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
问题是我不知道在进行任何选择之前我什至需要进入$hashed_input哪个saltX.
我可以一个接一个地浏览数据库行,在输入中尝试添加该盐,然后检查该盐的哈希值/盐值输入是否与同一行的hashX匹配.如果我有100,000条记录,我的猜测是这将非常缓慢.我不知道有多慢,因为我不太擅长数据库.
>有没有比选择所有行,遍历所有行,使用该行的salt哈希输入然后再次与db中的哈希值进行比较的更好方法?
解决方法:
如果可能(取决于您的哈希公式),请为哈希公式定义一个MySQL用户定义函数数据库端(请参见CREATE FUNCTION).这样,您将能够在一个简单的请求中获得结果:
SELECT hashedX, saltX FROM tablename WHERE UDFhash(input, saltX) = hashedX ;