【问题标题】:create a unique filename from a SQL statement in PHP [duplicate]从 PHP 中的 SQL 语句创建一个唯一的文件名 [重复]
【发布时间】:2011-08-01 07:58:20
【问题描述】:

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

md5($sql) 是否会导致每个 SQL 语句的文件名唯一?

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

非常感谢!

【问题讨论】:

  • 我需要它在每个 SQL 语句中都是唯一的,而不是对 SQL 语句的每个实例都是唯一的。即“从员工中选择*”每次都需要产生相同的文件名,但如果这有意义的话,那将需要与“从用户中选择*”不同的文件名
  • 我认为这确实是一个非常聪明的缓存方法!简单,但没有理由根本不有效!

标签: php


【解决方案1】:

对于唯一的输入字符串,md5 将是唯一的(除了极少数的冲突情况) - 所以你做的是正确的事情。 SHA1 会更好。

【讨论】:

    【解决方案2】:

    它将相当独特,不会成为问题。这就是 MD5 的重点,为唯一输入创建唯一哈希。尽管 MD5 并不完美,但您意外发现碰撞的机会是如此之低,以至于对于所有实际意图和目的来说都不存在。而且由于 MD5 确实很快,所以它是一个不错的选择。

    【讨论】:

    • "这就是 MD5 的重点,为唯一输入创建唯一哈希。"我完全不同意。这是错误的。哈希点,包括 md5 哈希,它给出不可逆的密码学和校验和。
    • @Skrol 这有什么不同?出于这两个目的,您需要唯一的哈希值来获得唯一的输入。这几乎就是校验和的定义。
    • 抱歉,这是错误的。函数定义中的“为独特的输入创建独特的东西”。任何功能都是这样的。这是基本的。根据其定义,哈希是一个函数。所以你写的那句话只是说MD5是一个哈希。哈希永远不会给出唯一的结果。
    • @Skrol 所以基本上,我写的没有错。我很乐意承认它是在一般方面,但我是在问题的背景下写的。我想我们说的是同一件事。
    【解决方案3】:

    嗯,这一切都取决于语句是什么。如果您曾经有相同的两个语句,那么不,它们不会是唯一的。

    您可以将当前日期或时间附加到字符串中,例如:

    $newsql = $sql.date('Y-m-d H:m:s');
    md5($newsql);
    

    您也可以使用strtotime() 函数来生成仅数字的时间戳。

    或者,您可以在 SQL 中附加 NOW() MySQL 命令,假设您正在返回数据,那么它将是唯一的,最后有一个时间。

    不知道为什么要从语句中创建文件?


    编辑

    抱歉,发帖者确实希望它们是独一无二的,以上将确保它们不是独一无二的。

    【讨论】:

    • 我认为重点是让两个相同的语句产生相同的哈希值。毕竟,OP 在谈论缓存。
    • 傻傻的我.....对不起,我完全误读了“需要独一无二”的部分。
    【解决方案4】:

    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】:

      您可以将uniqid() 添加到您正在散列的每个 $sql 中,如下所示:

      md5($sql.uniqid())
      

      让它更加独特。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 这简直是大材小用!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多