2011-06-03 16 views
5

BenHangi disk sha1 veya uniqid üzerinde rastgele dosya adı için daha iyi bir seçenek?

başarısız olası değildir yeni adı için daha sağlam bir yöntemdir
$filename = '/tmp/foo.txt'; 
$newName = sha1_file($filename); // 40 characters 
//or I can do 
$newName = uniqid($filename) // 13 characters 

dosyanın adını değiştirmek Disk klasörü içindeki uzak sunucuda kullanıcılar tarafından yüklenen dosyaları saklamak için ?? Teşekkürler.

+0

Ne demek başarısızlıkla? – Thilo

+0

@thilo başarısızlıkla Bu işlevin kararlılığını kastediyorum. –

+1

Ancak sha1_file, 1) kopyaları takip etmek için kullanışlıdır 2) dengeli bir ağaç isimlendirme şeması oluşturma – symcbean

cevap

6

Daha iyi bir çözüm tmpfile() veya tempnam() kullanmaktır. Her ikisinin de çakışmayacak, kullanılmayan bir dosya oluşturması garantilenir ve sizden gelen izinleri değiştiren sahte süreçler tarafından "engellenemez". Herhangi hash fonksiyonu deterministik Beeing avantajına sahip olduğu gibi - tempnam() SHA1 etrafında

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

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

+0

Evet, belirli bir dizinde kullanılmayan bir dosya adı almak için 'tempnam()' işlevini kullanın. Karma ve rastgele değerlere sahip diğer çözümler, halihazırda kullanımda olan dosya adlarını döndürür ve bunu yapmak için kolay bir yol varsa bunu neden şansa bırakmak istersiniz? – martinstoeckli

+0

Katılıyorum, tempnam() uniqid() 'den daha iyidir. Yine de, sha1_file'den daha iyi olmayabilir - aynı verileri iki kez saklamaktan kaçınmak için, aynı dosyaları aynı isimlerle saklamak isteyebilirsiniz. – Matt

+0

@Matt - Sha1_file() ile olan çözüm muhtemelen pratikte işe yarayacaktır, ancak ben onunla rahat değilim. Ya bir dosyanın aynı olduğunu ve üzerine yazılmasının/yeniden kullanılmasının gerektiğini ya da varsaymamalısınız. Karma algoritmalar, çarpışmalara izin verecek şekilde tasarlanmıştır; bu tür (nadiren) durumlarda, farklı kullanıcıların verilerini üzerine yazıp/paylaşırsınız. – martinstoeckli

1

Hiçbiri çarpışan ad vermemelidir. sha1_file çok daha yoğun bir hesaplamadır, ancak iki kullanıcı aynı dosyayı yüklediğinde, aynı ada sahip olacak ve sadece bir kez saklayacağınız kullanışlı bir özelliğe sahiptir. Çok fazla insanın aynı dosyayı yüklemesini beklemiyorsanız veya iki kez depolamayı umursamıyorsanız, çok sık karşılaşacaksınız.

1

Her iki durumda da dosyanın zaten mevcut olup olmadığını kontrol etmek istersiniz. % 100 güvenli olmasını isteriz ve dosyalar çok büyük değilse sonra sadece bu dosya zaten içeriğini var aynı nedenle bile bütün dosya için SHA-1 çeker

sha1_file($filename); 

kullanın.

Barış

1

tutar oysa tmpfile() otomatik, kapalı bulunuyor dosyayı siler. Durumunuzda bu istenmeyen olabilir. Bunun için bir hash işlevi kullanmak, eşit dosyalarda (gerçek hayatta meydana gelebilecek) çarpışmalarla sonuçlanacaktır. Bu durumda uniqueid olması daha iyidir. 13 karakterden oluşan daha küçük bir aralık, çok daha büyük bir olasılıkla karşılaşma olasılığı gösterse de, durum böyle değildir, çünkü nadiren, aynı anda 2 dosya yüklenir. Dosya adının önek olarak kullanılması (ve bu, $ new adınızın uzunluğunun artırılmasıyla), çoğu durumda sizi çarpışmalardan koruyacaktır. Eğer emin olmak istiyorsanız, herhangi bir çarpışma olmadan (veya bazı arızalar verilinceye kadar) mevcut dosya için bazı döngü kontrolleri eklemek ve ismini yeniden oluşturmak isteyebilirsiniz.

İlgili konular