【问题标题】:Create your own hash in PHP?在 PHP 中创建自己的哈希?
【发布时间】:2019-01-31 03:36:31
【问题描述】:

嗯,我需要保存具有唯一文件名的图像并将文件名存储在数据库中。我以前做MD5散列,用散列得到的值的文件名保存图像。

但是我想将不必要的空间使用从 32 个字符减少到 10-12 个字符。

我不想 substr() 得到的 md5 哈希为 12 个字符。

有没有办法创建一个 10-12 个字符的自定义散列?

【问题讨论】:

  • 可以用 16 个字符表示一个 128 位的 MD5 哈希值。
  • 请注意您仍然必须检查重复项。

标签: php hash


【解决方案1】:

使用下面的函数 Tempnam 怎么样

http://php.net/manual/en/function.tempnam.php

"在指定目录中创建一个文件名唯一的文件,访问权限设置为0600。如果该目录不存在,tempnam()可能会在系统的临时目录中生成一个文件,并返回该文件的名称。”

【讨论】:

  • 我实际上不想创建文件,我想将上传的具有唯一名称的文件移动到目录中。考虑到这个功能,我将不得不创建一个 tmp 文件,读取上传的文件,覆盖 tmp 文件。您不认为将文件从一个位置移动到另一个位置会更慢吗?
  • 根据文件的大小和上传的规律性,额外的开销应该是最小的
【解决方案2】:

您可以仅用 16 个字符(每个字符 8 位而不是 4 个)来表示 128 位 MD5 哈希值。

【讨论】:

  • 示例:1 个字节 = 1 个字符。 128 位 = 16 字节。 => 128 位 = 16 个字符。 md5("string", true) 提供 16 个字符。 小心! 字符串也将包含 \0 等。
  • 在 mysql 数据库中插入相同的值是否安全(utf-8 排序规则)或者我需要执行过滤器?
  • @atif089:最好使用 BINARY ASCII,因为字符 ≥ 128 在 UTF-8 中使用超过一个字节。另见stackoverflow.com/questions/504268
  • echo md5('1_DSC00144_' .time(), true);返回“ƒ|^×íñu¬‹_ë õòþ”,我需要使用 ASCII 字符串保存在数据库中,以便在 URL 中使用它。 bin2hex 再次恢复为 32 个字符。
  • 是的,就是这样,当您只使用 ASCII 的高 64 位时 ;-)
【解决方案3】:

也许使用 CRC32 而不是 MD5?它是 8 个字符,而不是 32 个,但它更接近您的目标。

【讨论】:

  • 是的,总共 26 ^ 8 .. 我想它足够了
  • 但我不希望它们发生冲突,这就是我寻找 10-12 个字符的原因
【解决方案4】:

PHP's Hash message digest framework 提供了大量的哈希算法。玩得开心!

要确定每个哈希的长度,see Wikipedia

【讨论】:

    【解决方案5】:

    CRC32 的长度为 8 个 ASCII 字符。

    【讨论】:

    • CRC32 是校验和 - 不是真正的哈希。几乎每 50K crc32(),你都会得到一个副本。
    【解决方案6】:

    我制作了这个简单的哈希函数来创建我自己的带有自定义字符和大小的哈希

    function simple_hash($str, $size=5, $characters='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
        $hash_array = array();
        $hash = '';
        for($i=0;$i<$size;$i++){
            $hash_array[$i]=0;
        }
        for($s=0;$s<strlen($str);$s++){
            for($i=0;$i<$size;$i++){
                $hash_array[$i]=($hash_array[$i]+ord($str[$s])+$i+$s+$size)%strlen($characters);
            }
        }
        for($i=0;$i<$size;$i++){
            $hash .= $characters[$hash_array[$i]];
        }
        return $hash;
    }
    

    使用方法:

    <?=simple_hash('test')?>  // EIMQU
    <?=simple_hash('test')?>  // EIMQU
    <?=simple_hash('test',10)?> // Y26aeimquy
    <?=simple_hash('test',10)?> // Y26aeimquy
    <?=simple_hash('test',10,'abcdefghijkl')?> // cgkcgkcgkc
    <?=simple_hash('test',10,'abcdeABCDE')?> // eDcBaeDcBa
    
    <?=simple_hash('test2')?>  // BGLQV 
    <?=simple_hash('test3')?>  // CHMRW
    <?=simple_hash('a big string')?> // gsEQ2
    <?=simple_hash('Ελληνικά')?> // 0gwM2
    <?=simple_hash('Ελληνικα')?> // 5lBR7
    

    【讨论】:

      猜你喜欢
      • 2013-03-05
      • 2021-04-03
      • 2011-09-20
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2013-12-21
      相关资源
      最近更新 更多