从PHP中的SQL语句创建唯一的文件名

时间:2011-04-08 08:19:48

标签: php

我想将长SQL命令转换为唯一的文件名以进行缓存练习。 我目前正在使用每个SQL命令的md5(),但不确定这些是否是唯一的。

md5($sql)每个SQL语句会产生唯一的文件名吗?

对于同一个SQL语句,那些md5字符串是否总是相同?他们需要适合我。

非常感谢!

7 个答案:

答案 0 :(得分:3)

对于唯一的输入字符串,md5将是唯一的(除非极少见的碰撞情况) - 所以你做的是正确的。 SHA1会更好。

答案 1 :(得分:3)

它将是非常独特的,永远不会成为一个问题。这就是MD5的全部要点,为独特输入创建独特的哈希值。尽管MD5并不完美,但是你偶然发现碰撞的可能性很小,以至于不存在所有实际意图和目的。由于MD5非常快,所以它是一个不错的选择。

答案 2 :(得分:1)

MD5-hashes并不是唯一的,但它们的独特性足以满足您的需要。如果它对您的应用程序逻辑有意义,您还可以使用tempnam(md5($sql))

见这里:

How are hash functions like MD5 unique?

答案 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个字符,缓存文件冲突的可能性要小得多。