[英]Generate unique number as image name
我是 asp.net c# 的初學者,開始開發一個網站,現在卡在圖片上傳表單上。 我必須生成一個唯一編號作為圖像名稱並將圖像存儲在圖像文件夾中。如何使用 c# 在 asp.net 中生成超過 2 位的唯一編號。 唯一編號還可以包括字母。
任何幫助都受到高度贊賞。 謝謝!
正如germi所說,唯一的4位數字將限制您只能使用10000張圖像。 如果你事先知道你永遠不會有超過 10000 張圖像,你可以從 0 開始,每次將數字增加 1 以獲得唯一 ID。
更好的解決方案是使用 Guid。 Guid 是全球唯一的 ID。
Guid g = Guid.NewGuid();
這樣您就不必擔心實現和檢查您的文件名是否唯一,因為它們保證是唯一的。
我建議您不要為此使用 4 位數字,因為您只會得到 10000 個。 看看Guid
- 它旨在為您提供獨特的價值。
如果數字不必是隨機的,您可以每次將計數器加一並跟蹤它。
如果你真的開始使用 0-10000 的隨機數,你可以使用這樣的東西:
Random r = new Random(); // <-- this should be only called once and not every time you want a random number
int nextRandom = r.Next(10000);
// as per the updated question, you want at least two digits
int nextRandomTwoDigits = r.Next(9990) + 10;
在此之后,您必須檢查該圖像是否已經存在(或者您必須保留已使用數字的列表並在那里查看)。
如果你想使用Guids
,你可以這樣做:
Guid newGuid = Guid.NewGuid();
string imageName = newGuid.ToString();
Guid
的設計是獨一無二的,因此您不會在這方面遇到任何問題。
GUID 是一個 128 位整數(16 字節),可用於所有需要唯一標識符的計算機和網絡。 這樣的標識符被復制的可能性非常低。
(請參閱文檔)。
正如每個人所說的,4 位數字非常小,除非在有限的用例中,否則不是特別有用。
您有幾種可能的解決方案。 使用 Guid 通常被認為是最好的解決方案,因為它可以跨機器工作,您不必檢查剛剛生成的是否已被使用。 所有其他方法都需要執行這種重復檢查,這取決於名稱的存儲方式可能是一件苦差事。
如果如您所說,您確實需要 4 位數字,並且僅允許使用 4 位數字,那么隨機數並不適合您。 只需按順序並使用關鍵部分即可。 您可以在目錄或數據庫中查找第一次使用的最高值,然后開始加一(您甚至可以使用互鎖增量來增加數字)。
但是,正如其他人所說,您應該重新考慮 4 位數限制。
你有沒有像這樣嘗試:
string filePath = Path.Combine(Server.MapPath("~/UserImages"), Path.GetFileName(Guid.NewGuid() + "_" + file.FileName));
這些路徑您將保存。
由於我通過評論詢問是否可以包含字母並且您說“是”,因此這是您已經接受的答案的替代方案。 您生成的圖像名稱相互沖突的機會要小得多。 如果圖像名稱中只有 1 個數字或字母(小寫或大寫),則奇數為 1/(10 + 26 + 26)。 如果圖像名稱中有 n 個數字或字母(小寫或大寫),則奇數會小得多。 事實上它是 (1/62) ^ n。 (^ 是對的冪)。 無論如何這里的代碼:
public char GenerateChar(System.Random random)
{
char randomChar;
int next = random.Next(0, 62);
if (next < 10)
{
randomChar = (char) (next + '0'); //0, 1, 2 ... 9
}
else if (next < 36)
{
randomChar = (char) (next - 10 + 'A'); //A, B, C ... Z
}
else
{
randomChar = (char) (next - 36 + 'a'); //a, b, c ... z
}
return randomChar;
}
public string GenerateString(System.Random random, int length)
{
char[] randomStr = new char[length];
for (int i = 0; i < length; i++)
{
randomStr[i] = GenerateChar(random);
}
return new string(randomStr);
}
正如一些人指出的那樣,只需調用一次 new Random() 或使其成為靜態或類似的東西,並在每次調用 GenerateString() 時將其傳入。
我現在認為它是一個舊線程,但是當我說為什么不時,我記得我自己,讓我們使用日期時間刻度作為其他任何東西的替代品。 如果要將圖像名稱存儲在數據庫中,則必須考慮字節。 所以與 guid 相比(沒有破折號):
long ticks = DateTime.Now.Ticks;
string tickUnique = String.Format("{0}", ticks);
string guidUnique = Guid.NewGuid().ToString();
guidUnique = guidUnique.Replace("-", "");
然后對於:
最后一點,我不得不提一下。 日期時間刻度在同一線程中總是唯一的。 在線程場景中您必須小心。
快樂編碼!
要添加到此對話中:
如果您出於存儲原因想要保留真實 ID,但希望您的用戶使用這些圖像和/或以不同方式生成其文件名,您可以使用諸如hashids.net 之類的庫。
基本上你插入一個“鹽”和一個數字,你會得到一個可以被你的系統逆轉的散列(因為你會知道鹽!)但用戶很難逆轉。 這也可以幫助您防止抓取工具通過您的端點進行掃描。
你的上傳處理程序看起來像這樣
private readonly IHashids _hashidsSource = new Hashids("Salty salt");
async Task HandleUploadedImage(MyImage img, CancellationToken ct)
{
// Assuming MyImage.Id is an int autogenerated by each uploaded image.
var hashedFilename = _hashidsSource.Encode(img.Id);
img.Filename = hashedFilename;
// TODO: ???
// Profit.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.