2011-06-03 19 views
5

डिस्क फ़ोल्डर के अंदर दूरस्थ सर्वर पर उपयोगकर्ताओं द्वारा अपलोड की गई फ़ाइलों को स्टोर करने के लिए मैंडिस्क sha1 या uniqid पर फ़ाइल के यादृच्छिक नाम के लिए एक बेहतर विकल्प कौन सा है?

$filename = '/tmp/foo.txt'; 
$newName = sha1_file($filename); // 40 characters 
//or I can do 
$newName = uniqid($filename) // 13 characters 

कौन सा नया नाम है कि असफल होने की संभावना नहीं है के लिए एक और अधिक मजबूत तरीका है करने के लिए फ़ाइल का नाम बदलने ?? धन्यवाद।

+0

असफल होने का आपका क्या मतलब है? – Thilo

+0

@thilo असफल होने का मतलब है कि उस कार्य की स्थिरता का मतलब है। –

+1

लेकिन sha1_file 1 के लिए आसान है) डुप्लिकेट ट्रैकिंग 2) एक संतुलित पेड़ नामकरण स्कीमा – symcbean

उत्तर

6

एक बेहतर समाधान tmpfile() या tempnam() उपयोग करने के लिए है। किसी एक को एक अप्रयुक्त फ़ाइल बनाने की गारंटी दी जाती है जो आपके द्वारा अनुमतियों को बदलने वाली दुष्ट प्रक्रियाओं द्वारा टकराए नहीं जा सकता है और "अवरुद्ध" नहीं किया जा सकता है। tmpfile() स्वचालित रूप से, फ़ाइल जब यह बंद है हटाता है जबकि tempnam() इसके चारों ओर

http://www.php.net/manual/en/function.tmpfile.php

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

+0

बनाओ हां, किसी दिए गए निर्देशिका में एक अप्रयुक्त फ़ाइल नाम प्राप्त करने के लिए 'tempnam()' फ़ंक्शन का उपयोग करें। हैश और यादृच्छिक मानों के साथ अन्य समाधान फ़ाइल नाम वापस कर सकते हैं जो पहले से ही उपयोग में हैं, और यदि आप इसे सही करने का आसान तरीका रखते हैं तो आप इसे भाग्य में क्यों छोड़ना चाहेंगे? – martinstoeckli

+0

मैं सहमत हूं, tempnam() uniqid() से बेहतर है। हालांकि sha1_file से बेहतर नहीं हो सकता है - आप समान डेटा को दो बार स्टोर करने से बचने के लिए समान नामों वाली समान फ़ाइलों को स्टोर करना चाह सकते हैं। – Matt

+0

@ मैट - sha1_file() के साथ समाधान शायद अभ्यास में अच्छा काम करेगा, हालांकि मैं इसके साथ सहज नहीं हूं। या तो आप _know_ कि एक फ़ाइल एक जैसी है और इसे ओवरराइट/पुन: उपयोग किया जाना चाहिए, या आपको इसे नहीं मानना ​​चाहिए। हैश एल्गोरिदम को टकराव की अनुमति देने के लिए डिज़ाइन किया गया है, ऐसे (दुर्लभ) मामलों में आप अलग-अलग उपयोगकर्ताओं के डेटा को ओवरराइट/साझा करेंगे। – martinstoeckli

1

न तो नाम देने वाले नाम देना चाहिए। sha1_file बहुत अधिक गहन गहन है, लेकिन इसमें उपयोगी संपत्ति है कि यदि दो उपयोगकर्ता एक ही फ़ाइल को अपलोड करते हैं, तो उसे वही नाम दिया जाएगा और आप इसे केवल एक बार स्टोर करेंगे। यदि आप बहुत से लोगों को एक ही फ़ाइल अपलोड करने की उम्मीद नहीं करते हैं, या इसे दो बार संग्रहीत करने की परवाह नहीं करते हैं, तो uniqid बहुत तेज़ी से चलेंगे।

1

किसी भी मामले में आप यह जांचना चाहते हैं कि फ़ाइल पहले से मौजूद है या नहीं। आप 100% सुरक्षित बनाना चाहते हैं और फ़ाइलों को बहुत बड़ा नहीं कर रहे हैं तो बस का उपयोग

sha1_file($filename); 

इस पूरी फ़ाइल इसलिए भले ही फ़ाइल पहले से ही मौजूद है सामग्री एक ही है के लिए SHA-1 खींच लेंगे।

शांति

1

SHA1 रहता है - किसी भी हैश फंक्शन नियतात्मक beeing का लाभ दिया है साथ के रूप में। आपके मामले में यह अवांछित हो सकता है। इसके लिए केवल एक हैश-फ़ंक्शन का उपयोग करने के परिणामस्वरूप बराबर फाइलों पर टकराव होगा (जो वास्तविक जीवन में हो सकता है)।

इस मामले में अद्वितीय होना बेहतर है। हालांकि 13 वर्णों की छोटी श्रृंखला को Collisisons के लिए बहुत अधिक संभावना का संकेत मिलेगा, यह मामला नहीं है, क्योंकि यह दुर्लभ है, कि एक ही पल में 2 फाइलें अपलोड की गई हैं। उपनाम के रूप में फ़ाइल नाम का उपयोग करने के बावजूद (और इससे आपके $ नए नाम की लंबाई बढ़ने से) आपको ज्यादातर मामलों में टकराव से बचाएगा। यदि आप सुनिश्चित करना चाहते हैं, तो हो सकता है कि आप मौजूदा फ़ाइल के लिए कुछ लूप जांच जोड़ना चाहें, और नाम का पुनर्निर्माण करना चाहें, जब तक कि आपके पास टकराव न हो (या कुछ ब्रेक-हालत दी जाती है)।