基于php上传图片重命名的6种解决方法的详细介绍_PHP
一,适用场景:无法使用从数据库中返回的自增长数字,给上传图片重命名。
这是图片或文件上传的流程决定的。
一般图片上传处理过程是,先上传图片到服务器,重命名之后,插入到数据库。
也就是说,在数据库中非常容易获得的自增长id,无法用于给上传的图片重命名,来避免文件名称的重复,
而采用从数据库中获取最大id加1的方式,增加了数据库连接的次数,不适用于高并发和数据量巨大的情况;
二,常规方案:
1,guid:32 字符十六进制数。
格式:GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个32位十六进制数。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。
优点:几乎不会重复;
缺点:对于给上传的图片重命名,还是过长了。
用法:
复制代码 代码如下:
/*
com_create_guid()是php5版本支持的功能,对于不支持的版本,可以自己进行定义;
*/
function guid(){
if (function_exists('com_create_guid')){
return com_create_guid();
}else{
mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
echo(mt_rand());
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45);// "-"
$uuid = chr(123)// "{"
.substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12)
.chr(125);// "}"
return $uuid;
}
}
2,MD5:
与guid 一样会输出32 字符十六进制数,区别是guid是随机产生的,md5需要根据输入的数据生成。
例子,
复制代码 代码如下:
$str = "Hello";
echo md5($str);
?>
输出,
复制代码 代码如下:
8b1a9953c4611296a827abf8c47804d7
优点:可以根据输入的种子数据来控制输出的数值,如果种子数据是规律性不重复的,通过md5可以对数据进行保护,产生很大的混淆作用。
缺点:32位字符过长;需提供不重复的种子数据;
用法:高并发,以秒为种子数据,仍然会出现重复现象。
复制代码 代码如下:
/*
*结合time()函数使用,以1970年到当前时间的秒数作为种子数。
*/
$str=time();
echo md5($str);
?>
3,uniqid():返回13或23位字符串。
对于我们目的来说,uniqid()像是md5()的改进版,尤其是我们可以采用差异性标识作为字符串前缀,可以降低重复命名出现的几率。
对于非高并发等极端情况,推荐使用此函数,已经可以满足一般性需求。
详细说明,
定义:uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。
用法:uniqid(prefix,more_entropy)
说明:prefix可以为输出的字符串添加前缀,示例如下,more_entropy参数为true时,将输出23位字符串。
复制代码 代码如下:
var_dump(uniqid());
var_dump(uniqid("a"));
?>
输出结果为:
复制代码 代码如下:
string(13) "51734aa562254" string(14) "a51734aa562257"
优点:13位字符串长度,是可以接受的文件命名长度;可以添加前缀,结果包含数据混淆,能够避免反推原始数据。
缺点:同md5相似,高并发,以秒为种子数据,仍然会出现重复现象。
三、升级版方案:
1,fast_uuid:返回17位数字。
有点像uniqid()的不完全定制版,这个函数里面出现的“种子数开始时间”概念很有启发性。
time()和uniqid()中默认用到的时间都是从1970年开始计算的,长度有十位(1366512439),采用“种子数开始时间”能够缩小这个数值,因为我们实际上需要的,仅仅是一个能够自动增长的数值即可。
起始时间自定义以后,除了减少长度,还能够起到混淆的作用。
复制代码 代码如下:
/*
* 参数 suffix_len指定 生成的 ID 值附加多少位随机数,默认值为 3。
* 感谢“Ivan Tan|谭俊青 DrinChing (at) Gmail.com”提供的算法。
* @param int suffix_len
* @return string
*/
function fast_uuid($suffix_len=3){
//! 计算种子数的开始时间
$being_timestamp = strtotime('2013-3-21');
$time = explode(' ', microtime());
$id = ($time[1] - $being_timestamp) . sprintf('%06u', substr($time[0], 2, 6));
if ($suffix_len > 0)
{
$id .= substr(sprintf('%010u', mt_rand()), 0, $suffix_len);
}
return $id;
}
输出,
复制代码 代码如下:
29832412631099013
2,time()+随机数:
上例中已经出现了随机数的使用,是为了解决一秒下发生的多次请求。提供两个函数如下,
复制代码 代码如下:
function random($length) {
$hash = '';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
PHP_VERSION for($i = 0; $i $hash .= $chars[mt_rand(0, $max)];
}
return $hash;
}
function random2($length, $numeric = 0) {
PHP_VERSION $seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35);
$seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed));
$hash = '';
$max = strlen($seed) - 1;
for($i = 0; $i $hash .= $seed[mt_rand(0, $max)];
}
return $hash;
}
?>
四,最终方案:
思路:userid+秒+随机数。其中“userid+秒”10进制转64进制,缩减位数;
说明:
1,userid: 64进制最大值“ZZZZ"转换为十进制等于”16777215“,”ZZZ“转换为十进制最大值等于”262143“;
2,秒:设置自己的时间起点。
$less=time()-strtotime('2012-4-21'); 转换为64进制”1SpRe“,5位
$less=time()-strtotime('2013-3-21'); 转换为64进制”_jHY“;4位
3,随机数:使用random(3)生成3位随机数;
最终结果:
4位userid+4位秒+3位随机数=11位字符串。虽然与uniqid()结果看上去相似,但是强壮度有所提高。
五,十进制转64进制算法:
1,算法1:
复制代码 代码如下:
View Code
const KeyCode = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$';
/**
* 将64进制的数字字符串转为10进制的数字字符串
* @param $m string 64进制的数字字符串
* @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
* @return string
* @author 野马
*/
function hex64to10($m, $len = 0) {
$m = (string)$m;
$hex2 = '';
$Code = KeyCode;
for($i = 0, $l = strlen($Code); $i $KeyCode[] = $Code[$i];
}
$KeyCode = array_flip($KeyCode);
for($i = 0, $l = strlen($m); $i $one = $m[$i];
$hex2 .= str_pad(decbin($KeyCode[$one]), 6, '0', STR_PAD_LEFT);
}
$return = bindec($hex2);
if($len) {
$clen = strlen($return);
if($clen >= $len) {
return $return;
}
else {
return str_pad($return, $len, '0', STR_PAD_LEFT);
}
}
return $return;
}
/**
* 将10进制的数字字符串转为64进制的数字字符串
* @param $m string 10进制的数字字符串
* @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
* @return string
* @author 野马
*/
function hex10to64($m, $len = 0) {
$KeyCode = KeyCode;
$hex2 = decbin($m);
$hex2 = str_rsplit($hex2, 6);
$hex64 = array();
foreach($hex2 as $one) {
$t = bindec($one);
$hex64[] = $KeyCode[$t];
}
$return = preg_replace('/^0*/', '', implode('', $hex64));
if($len) {
$clen = strlen($return);
if($clen >= $len) {
return $return;
}
else {
return str_pad($return, $len, '0', STR_PAD_LEFT);
}
}
return $return;
}
/**
* 将16进制的数字字符串转为64进制的数字字符串
* @param $m string 16进制的数字字符串
* @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
* @return string
* @author 野马
*/
function hex16to64($m, $len = 0) {
$KeyCode = KeyCode;
$hex2 = array();
for($i = 0, $j = strlen($m); $i $hex2[] = str_pad(base_convert($m[$i], 16, 2), 4, '0', STR_PAD_LEFT);
}
$hex2 = implode('', $hex2);
$hex2 = str_rsplit($hex2, 6);
foreach($hex2 as $one) {
$hex64[] = $KeyCode[bindec($one)];
}
$return = preg_replace('/^0*/', '', implode('', $hex64));
if($len) {
$clen = strlen($return);
if($clen >= $len) {
return $return;
}
else {
return str_pad($return, $len, '0', STR_PAD_LEFT);
}
}
return $return;
}
/**
* 功能和PHP原生函数str_split接近,只是从尾部开始计数切割
* @param $str string 需要切割的字符串
* @param $len integer 每段字符串的长度
* @return array
* @author 野马
*/
function str_rsplit($str, $len = 1) {
if($str == null || $str == false || $str == '') return false;
$strlen = strlen($str);
if($strlen $headlen = $strlen % $len;
if($headlen == 0) {
return str_split($str, $len);
}
$return = array(substr($str, 0, $headlen));
return array_merge($return, str_split(substr($str, $headlen), $len));
}
$a=idate("U");
echo "\r\n
e:" . hex10to64($a);
echo "\r\n
e:" . hex64to10(hex10to64($a));
2,算法2:
复制代码 代码如下:
View Code
function dec2s4($dec) {
$base = '0123456789_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$result = '';
do {
$result = $base[$dec % 64] . $result;
$dec = intval($dec / 64);
} while ($dec != 0);
return $result;
}
function s42dec($sixty_four) {
$base_map = array ( '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, '_' => 10, '$' => 11, 'a' => 12, 'b' => 13, 'c' => 14, 'd' => 15, 'e' => 16, 'f' => 17, 'g' => 18, 'h' => 19, 'i' => 20, 'j' => 21, 'k' => 22, 'l' => 23, 'm' => 24, 'n' => 25, 'o' => 26, 'p' => 27, 'q' => 28, 'r' => 29, 's' => 30, 't' => 31, 'u' => 32, 'v' => 33, 'w' => 34, 'x' => 35, 'y' => 36, 'z' => 37, 'A' => 38, 'B' => 39, 'C' => 40, 'D' => 41, 'E' => 42, 'F' => 43, 'G' => 44, 'H' => 45, 'I' => 46, 'J' => 47, 'K' => 48, 'L' => 49, 'M' => 50, 'N' => 51, 'O' => 52, 'P' => 53, 'Q' => 54, 'R' => 55, 'S' => 56, 'T' => 57, 'U' => 58, 'V' => 59, 'W' => 60, 'X' => 61, 'Y' => 62, 'Z' => 63, );
$result = 0;
$len = strlen($sixty_four);
for ($n = 0; $n $result *= 64;
$result += $base_map[$sixty_four{$n}];
}
return $result;
}
$a=idate("U");
var_dump(dec2s4($a));
var_dump(s42dec(dec2s4($a)));
3,算法效率测试:
复制代码 代码如下:
View Code
$strarr = array();
$time1 = microtime(true);
for($i = 0; $i $str = idate("U")+$i;
$strarr[] = "{$i}->$str\r\n
";
}
$time2 = microtime(true);
$time3 = $time2 - $time1;
$time1 = microtime(true);
for($i = 0; $i $str = dec2s4(idate("U")+$i);
$strarr[] = "{$i}->$str\r\n
";
}
$time2 = microtime(true);
echo "\r\n
运行10000次用时(秒):" . ($time2 - $time1 - $time3);
4,测试结果
算法1:0.1687250137329
算法2:0.044965028762817
5,结论:算法1虽然效率上差一些,但是可以把md5生成的16进制转化为64进制,能够使用在必须使用md5的环境下缩短字符串。
六,总结
本文涉及了上传图片重命名可以能使用的几种方法,其中关键点是使用10进制转换为64进制来进行字符串的缩减。
例如,使用fast_uuid生成的17位数字,转换为64进制仅有7位字符;
具体使用,可以根据自身情况灵活使用,希望对大家有所帮助。
参考文献:
1,GUID百度百科:http://baike.baidu.com/view/185358.htm
2,com_create_guid() 官方指南:http://www.php.net/manual/zh/function.com-create-guid.php
3,MD5()函数说明:http://www.w3school.com.cn/php/func_string_md5.asp
4,time()函数说明:http://www.w3school.com.cn/php/func_date_time.asp
5,uniqid()函数说明:http://www.w3school.com.cn/php/func_misc_uniqid.asp

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











많은 Windows 11 사용자는 드라이버가 시스템에 로드되지 못하게 하고 취약한 것으로 표시되는 "이 장치(ene.sys)에 드라이버를 로드할 수 없습니다"라는 오류 메시지를 경험했습니다. 그러나 이 문제는 주로 PC를 Windows 11로 업그레이드한 사용자가 보고합니다. 이 오류는 시스템 운영 체제 업데이트 문제로 인해 손상된 드라이버 및 파일과 밀접한 관련이 있습니다. 업데이트 후 Windows 11 컴퓨터를 켤 때마다 이 "ene.sys" 오류가 발생하는 경우 이 문서를 계속 읽으세요. 여기에서는 PC에서 이 오류가 나타날 경우 사용할 수 있는 몇 가지 문제 해결 방법을 찾을 수 있습니다. 수정 1 - 선택적 업데이트 1단계를 설치합니다. Windows+R 그룹 사용

사무실에 프린터가 많으면 프린터 목록이 길어져 작업을 지루하게 만들 수 있습니다. 게다가 여러 프린터는 일반적으로 유사한 이름을 의미하므로 다소 혼란스러울 수 있습니다. 끝없이 이어지는 목록을 스크롤하다가도 인쇄 작업을 잘못된 프린터로 보내는 일은 절대 원하지 않습니다. 다행히도 아래에서 보여드릴 간단한 이름 변경 방법으로 이러한 모든 문제를 해결할 수 있습니다. Windows 11에서 프린터 이름을 어떻게 바꾸나요? 1. 설정 앱을 사용하여 키를 탭하고 설정을 클릭합니다. Windows에서는 Bluetooth 및 장치를 클릭하고 프린터 및 스캐너를 선택합니다. 이름을 바꾸려는 프린터를 선택합니다. 프린터 속성을 클릭합니다. 일반 탭으로 이동하여 키
![Explorer.exe가 시스템 시작 시 시작되지 않음 [수정]](https://img.php.cn/upload/article/000/887/227/168575230155539.png?x-oss-process=image/resize,m_fill,h_207,w_330)
요즘 많은 Windows 사용자는 심각한 Windows 시스템 문제에 직면하기 시작합니다. 문제는 시스템이 로드된 후 Explorer.exe를 시작할 수 없고 사용자가 파일이나 폴더를 열 수 없다는 것입니다. 그러나 Windows 사용자는 경우에 따라 명령 프롬프트를 사용하여 Windows 탐색기를 수동으로 열 수 있으며 시스템을 다시 시작할 때마다 또는 시스템 시작 후에 그렇게 해야 합니다. 이는 문제가 될 수 있으며 아래에 언급된 다음 요인으로 인해 발생합니다. 시스템 파일이 손상되었습니다. 빠른 시작 설정을 활성화합니다. 오래되었거나 문제가 있는 디스플레이 드라이버. 시스템의 일부 서비스가 변경되었습니다. 수정된 레지스트리 파일. 위의 모든 요소를 염두에 두고 사용자에게 확실히 도움이 될 몇 가지 요소를 생각해냈습니다.

win10에서 파일 접미사 이름을 일괄 바꾸는 방법은 무엇입니까? 요즘에는 많은 사용자들이 Win10 시스템을 사용하고 있으며, 평소 컴퓨터를 사용할 때 단축키를 사용하면 작업이 더욱 편리해지기 때문에 단축키를 많이 사용하는 경우가 많은데 파일 이름을 일괄적으로 바꾸는 방법은 무엇일까요? 아래에서 편집기는 Win10에서 파일 이름을 일괄적으로 바꾸는 작업을 소개합니다. Win10에서 파일 이름을 일괄적으로 바꾸는 방법 1. 이름을 바꾸려는 파일을 모두 선택합니다. 2. 선택한 파일을 마우스 오른쪽 버튼으로 클릭하고 이름 바꾸기를 선택합니다. 3. 파일 이름을 변경한 후에는 다른 파일에도 차례로 일련번호가 표시됩니다. 방법은 매우 간단하지만, 수정 시 파일의 순서와 수정된 샘플 파일의 정렬 위치에 주의해야 합니다. 일련번호는 수정된 샘플 파일에서 시작됩니다.

이름 바꾸기 단축키는 F2 입니다. 분석 1 이름 바꾸기 단축키는 F2입니다. 2 파일이나 폴더의 이름을 바꾸려면 파일을 선택한 후 F2를 누르고 직접 수정한 후 Enter를 누르면 됩니다. 3 때로는 마우스를 사용하여 파일을 선택하고 마우스 오른쪽 버튼을 클릭한 후 이름 바꾸기를 선택하고 수정이 완료된 후 Enter 키를 누를 수도 있습니다. 4 단축키는 특정 명령을 신속하게 완료하기 위한 키보드의 특수 조합 또는 키 순서를 말하며, 이는 작업 효율성을 효과적으로 향상시킬 수 있습니다. 보충: 바로 가기 키란 무엇입니까? 1 바로 가기 키라고도 하는 바로 가기 키는 특정 키, 키 시퀀스 또는 키 조합을 통해 작업을 완료하는 것을 의미합니다. 바로 가기 키를 사용하여 마우스 대신 일부 작업을 수행할 수 있습니다. 키보드 바로 가기를 사용하여 시작 메뉴, 바탕 화면, 메뉴 및 대화 상자를 열고 닫고 탐색할 수 있습니다.

파일 유형(확장자)을 변경하는 것은 간단한 작업입니다. 그러나 때로는 간단한 일이 까다로울 수 있으며 파일 확장자를 변경하는 것도 그 중 하나입니다. 단순한 실수로 인해 파일이 손상되어 작동하지 않게 될 수 있으므로 파일 형식을 변경할 때는 각별히 주의해야 합니다. 그래서 Windows 11, 10에서 파일 형식을 변경하는 다양한 방법에 대해 논의했습니다. Windows 11, 10에서 파일 형식을 변경하는 방법 두 가지 방법이 있습니다. 직접 GUI 방법(파일 탐색기에서)을 사용하거나 터미널에서 파일 형식을 변경할 수 있습니다. 방법 1 - 파일 탐색기 사용 방법 2 - CMD 터미널 사용 방법 1 - 파일 형식 직접 변경 파일 탐색기에서 파일 형식을 위아래로 직접 변경할 수 있습니다.

PC의 다른 게임과 마찬가지로 Counter-Strike: Global Offensive는 실행 시 충돌, 정지 또는 검은색 화면이 나타날 수 있습니다. Counter-Strike는 시중에서 리소스가 부족한 fps 게임 중 하나이며 Tudou PC에서도 실행됩니다. CSGO는 CPU 중심의 게임이지만 시스템 GPU도 중요한 역할을 합니다. 검은색 화면 문제는 GPU 문제와 관련이 있습니다. 문제를 해결하려면 다음의 간단한 해결 방법을 따르십시오. 수정 1 – 호환성 끄기 Windows 8 또는 7에서 호환 모드로 게임을 실행하는 경우 호환성을 끄십시오. CSGO는 모든 Windows 버전(WindowsXP 이상)에서 작동합니다.

Gson@SerializedName 주석은 JSON으로 직렬화될 수 있으며 제공된 이름 값을 필드 이름으로 가질 수 있습니다. 이 주석은 Gson 인스턴스에 설정되었을 수 있는 기본 필드 명명 정책을 포함하여 모든 FieldNamingPolicy를 재정의할 수 있습니다. GsonBuilder 클래스를 사용하여 다양한 명명 전략을 설정할 수 있습니다. Syntax@Retention(value=RUNTIME)@Target(value={FIELD,METHOD})public@interfaceSerializedNameExample importcom.google.gson.annotations.*;
