我想将长SQL命令转换为唯一的文件名以进行缓存练习。
我目前正在使用每个SQL命令的md5()
,但不确定这些是否是唯一的。
md5($sql)
每个SQL语句会产生唯一的文件名吗?
对于同一个SQL语句,那些md5
字符串是否总是相同?他们需要适合我。
非常感谢!
答案 0 :(得分:3)
对于唯一的输入字符串,md5将是唯一的(除非极少见的碰撞情况) - 所以你做的是正确的。 SHA1会更好。
答案 1 :(得分:3)
它将是非常独特的,永远不会成为一个问题。这就是MD5的全部要点,为独特输入创建独特的哈希值。尽管MD5并不完美,但是你偶然发现碰撞的可能性很小,以至于不存在所有实际意图和目的。由于MD5非常快,所以它是一个不错的选择。
答案 2 :(得分:1)
MD5-hashes并不是唯一的,但它们的独特性足以满足您的需要。如果它对您的应用程序逻辑有意义,您还可以使用tempnam(md5($sql))
。
见这里:
答案 3 :(得分:0)
嗯,这一切都取决于声明是什么。如果你有相同的两个陈述,那么它们就不会是唯一的。
您可以将当前日期或时间附加到字符串,例如:
$newsql = $sql.date('Y-m-d H:m:s');
md5($newsql);
您也可以使用strtotime()
功能生成仅限时间戳的数字。
或者,您可以在SQL中附加NOW()
MySQL命令,假设您正在返回数据,那么它将是唯一的,并且最后有时间。
不确定为什么要从语句中创建文件?
修改强>
我的道歉,海报是否希望它们是独一无二的,以上将确保它们不是唯一的。
答案 4 :(得分:0)
Md5执行的哈希不是唯一的。然而,10 ^ 36有一次机会与另一个散列弦相撞。
如果要执行完全确保没有冲突的缓存,可以将查询和查询结果保存在缓存文件中。然后,当您使用SQL语句的md5检索文件高速缓存时,还可以检查SQL语句是否相同。
缓存文件示例:
sql_cache_fc25e47b204dc615d96749180c72cbf8.php:
<?php
$sql = 'SELECT id, name FROM table1 ORDER BY id';
$result = array( 0=> array('id'=>1, 'name'=>'bob'), 1=> array('id'=>2, 'name'=>'tom') );
答案 5 :(得分:-1)
您可以将uniqid()
添加到您正在散列的每个$ sql中,如下所示:
md5($sql.uniqid())
使其更加独特。
答案 6 :(得分:-1)
我只是在我的CMS中执行此操作,大多数系统允许使用255个字符的文件名,并且您可以通过使用字符串的操作来创建长md5哈希。
例如
$sql='Your MySQL String';
$filename='mysqlcache_'.md5($sql).md5(strrev($sql)).md5('MYSQL'.$sql).sha1($sql);
因此字符串长度为11 + 32 + 32 + 32 + 40 = 147个字符,缓存文件冲突的可能性要小得多。