Kısa ve benzersiz dosya / klasör adları oluşturmak için iyi bir yolu nedir?

8 Cevap php

Kriterleri temelde şudur:

  • klasörler yaklaşık 24-48 saat için var olacaktır
  • (Bir URL kullanıldığı taktirde) klasörleri isimleri kolaylıkla bir kullanıcı tarafından tahmin edilebilir edilemez
  • Klasör adları kısa 5-15 karakter olmalı

İlk düşünceler:

printf('%u',crc32(microtime(true)));

Details: When uploading a file, I basically want to keep the unique file name as named by the uploader, so to avoid any naming collision I would like to put it in a uniquely named directory ...

8 Cevap

[Düzenle] bir saniye bekleyin. PHP sağ unique id generator function standart kitaplığı içerir. other approaches de vardır.

Klasik bir tekniktir şey gibi görünüyor

  + uploader-name  
    + 20090401
      + 010000     // hhmmss
      + 013000     // hhmmss
      + 014500     // hhmmss
    ...

    + 20090402

, seviyeleri ekleyerek, "b" "a" ekleyerek, "c", ... vb istenilen ayrıntı dayanmaktadır.

Bu ESP çalışır. iyi kullanıcı tüm kronolojik olarak dosyalara ilişkin ise.

Birkaç varlığı numaralandırma yapıyor sonuna kadar, ama o kadar acı değil. Ben kullanıcı direnç buldum herhangi bir alternatif daha düşük olmasından dolayı, (PHP dahil) ile bu birçok kez kullandım.

Bunu eğimli iseniz tarih ifadeleri güzelleştirmek olabilir - "2009-Nisan-01", "01:45" vb

Dil Ruby ben yapardım, belirtilmedi:

require 'digest/md5'
Digest::MD5.hexdigest(Time.now.to_s)

=> "f531384b3cc8c60b7c5b7ad087cb0ae4"

Bu soruna bir "bilinmezlik tarafından güvenlik" gibi geliyor. Kimse konumunu tahmin edeceği bir beklenti var sadece çünkü güvenli bir şekilde potansiyel olarak hassas verileri oluşturur ve (hatta kısa bir süre için) bunu ortaya şeye karşı öneriyoruz. Kaba kuvvet saldırıları vardır ve onlar, "güvenlik" bu tür ayrı rip olabilir.

Adını oluşturmak için tarih ve zaman kullanın

Ben gibi bir şey kullanmak istiyorum:

$salt='Whatever you want';
$folderName=SHA1($salt.date('U'));

Tarih ('U') Unix Epoch beri saniye döndürür (1 Ocak 1970 00:00:00 GMT) bu yüzden muhtemelen aynı anda birden fazla klasör üreten sürece benzersiz olacak?

Bu durumda, sadece kurnazca (bir kullanıcı adı veya rastgele sayı vb yapmak) $ tuz değerini değiştirin.

Zamanında karma (md5 veya sha ya) oturtmakta dizin oluşturulduğunda kullanıcı kabaca bilir eğer guessable yapar. Yapmaları gereken tek şey bir kaç saniye yan ya kapsadığı tüm olanakları oluşturmak ve daha sonra bir yanıt arıyor siteyi vurmak için basit bir script kurulum. Bu yardımcı olurken, bir tuz ekleyerek uzun vadede çok daha iyi yapmaz.

OP için, yukarıda belirtilen herhangi bir yöntem için de geçerlidir anlamına gelir. Eğer çok hızlı sunucusu çalıştıran varsa, rastgele dizinleri karşı hit izlemek gerekir. Sadece 5 harf dizinleri var birisi elle dizini keşfetmek için siteyi yeterli kez vurmak olabilir anlamına gelir. 15 biraz arttırmak, ama bir kaç makine bir metne şekilde yapıyor, bu olasılık dışında değildir.

C + + standart fonksiyonları tmpfile ve tmpnum, cstdio (stdio.h), her ikisi de ve buna göre geçici bir dosya ve geçici dosya adı oluşturur gelmiştir. tmpfile da programın sonunda silinir. Ben bunları bağlamak istiyorum ama ne yazık ki ben henüz link olamaz.