Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多列,一个字符串_Php_Mysql_Mysqli - Fatal编程技术网

Php 多列,一个字符串

Php 多列,一个字符串,php,mysql,mysqli,Php,Mysql,Mysqli,好吧,好吧。我正在制作一个哈希/去哈希网站,用于对MD5、SHA1、SHA512等进行哈希处理。在制作过程中,我决定执行以下表结构: hash_id int(11) plain_text varchar(100) hash_md5 varchar(32) hash_base64 varchar(500) hash_sha1 varchar(50) hash_sha512 varchar(128) hash_mysql varchar(50) 在我的类中使用Dehash()函数时,

好吧,好吧。我正在制作一个哈希/去哈希网站,用于对MD5、SHA1、SHA512等进行哈希处理。在制作过程中,我决定执行以下表结构:

hash_id int(11)
plain_text varchar(100)
hash_md5 varchar(32)    
hash_base64 varchar(500)
hash_sha1 varchar(50)   
hash_sha512 varchar(128)
hash_mysql varchar(50)
在我的类中使用
Dehash()
函数时,我发现我不能仅仅使用或“搜索”字符串而不遇到性能问题,所以我想问,是否有某种MySQL函数可以帮助我做到这一点而不会出现性能问题

此外,还有一个问题可能是我必须获取散列所在的列名,例如:

如果我使用或,我的问题是:

$Query = $this->DB->prepare("SELECT plain_text, hash_md5, hash_base64, hash_sha1, hash_sha512, hash_mysql FROM hashes WHERE hash_md5 = ? OR hash_base64 = ? OR hash_sha1 = ? OR hash_sha512 = ? OR hash_mysql = ?");
$Query->bind_param("sssss", $Hash, $Hash, $Hash, $Hash, $Hash);
$Query->execute();
$Query->bind_result($pt,  $md5, $b64, $sha1, $sha512, $mysql);
$Query->fetch();
$Query->close();

但你没看到这会造成多大的问题吗?在我这样做的时候,我还必须执行一个if语句来检查列是否包含哈希,如果是,那就是包含哈希的列,但是其他列会占用内存,使我的站点变慢。

假设所有哈希字段上都有索引,这应该很快

SELECT plain_text, 'md5' as hash_type,
FROM hashes WHERE hash_md5 = ?
UNION 
SELECT plain_text, 'sha1' as hash_type,
FROM hashes WHERE hash_sha1 = ?
UNION 
SELECT plain_text, 'sha512' as hash_type,
FROM hashes WHERE hash_sha512 = ?
UNION 
...
如果您使用OR-s选择它,mysql有时会将其优化为等效的内容,但不能保证

一个更好的方法是有一张像这样的桌子

CREATE TABLE `hashes` (
    `plaintext` VARCHAR(255) NOT NULL,
    `hash_type` VARCHAR(10) NOT NULL,
    `hash_value` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`plaintext`, `hash_type`),
    INDEX `hash_value` (`hash_value`)
);

谢谢你的回答。有人告诉我,我使用的表结构是一种更快的方法,因为它在每个加密字符串中占用的行更少(如果纯文本是相同的话)。您认为这是真的吗?它将占用更少的行,但数据量将是相同的,因为每行将有更多的数据。我不确定哪一个会更快。您可以创建两个表,每个表都有几百万行,然后尝试确定。您还可以使hash_type成为枚举列以从中挤出更多字节。当然,我将按照您的建议进行测试。我的第一个表结构与您发布的表结构类似;纯文本、哈希类型、哈希。我有1200万行,甚至需要几秒钟才能获得行数(我使用COUNT(纯文本),并获取结果,这比使用mysql\u num\u rows和/或$Query->num\u rows要快)。从数据库中插入/检索散列也花费了更长的时间,这就是我更改表结构的原因,我正在重新编码网站;如果我没有得到我想要的东西,我会回信的。非常感谢。