讓我們假設我們有字符串名稱=「stackoverflow.com」;C#如何將字符串轉換爲唯一的ID
如何將此字符串int轉換爲唯一ID或某種哈希。 (無MD5,因爲它太大了),它不應該是隨機的
我會想有這樣的事情
請注意字符串本身太大,我想知道,如果字符串可以寫短。在字母,數字和符號
f¤k^§〜7天?Æ
讓我們假設我們有字符串名稱=「stackoverflow.com」;C#如何將字符串轉換爲唯一的ID
如何將此字符串int轉換爲唯一ID或某種哈希。 (無MD5,因爲它太大了),它不應該是隨機的
我會想有這樣的事情
請注意字符串本身太大,我想知道,如果字符串可以寫短。在字母,數字和符號
f¤k^§〜7天?Æ
這是一個沒有限制你的域名是不可能的組合。有無限多的string
s,因此不能被映射到任何有限集合中。因此,唯一性是不可能的。
如果您確實想要string
的唯一標識符,請使用string
本身。
井字符串本身太大我想知道如果字符串可以寫得更短。在字母,數字和符號的組合中 – 2011-01-08 13:18:36
name.GetHashCode()
這可能是您最好的選擇。任何形式的散列都是一個常見的問題,它不能被認爲是唯一的,但是通過允許散列更長,你可以使它更有可能是唯一的。
你也可以使用結合不同的哈希算法彼此增加支持的範圍
編輯
然後,你可以創建一個自定義的雜湊碼功能,如
public static int GetHashCode (string value)
{
int h = 0;
for (int i = 0; i < value.Length; i ++)
h += value [i] * 31^value.Length - (i + 1);
return h;
}
(從別處被盜)
如果你使用散列,它需要足夠的只要是獨一無二的,那可能比你想要的還要長。 您需要2^(BitLength/2) >> n
,其中BitLength是散列的長度,n是字符串的數量。
如何使用Dictinary<string,int>
和計數器代替?
Jason是非常正確的 - 你不能創建一個可以任意長度的字符串的有限大小的唯一散列。我向你承諾,你正在尋找的不是一個散列,而是一個compression algorithm on short strings。
有什麼東西阻止你使用`String.GetHashCode`產生的散列嗎? – driis 2011-01-08 12:58:34
**任何**散列應該是**不唯一**,只是因爲它是一個散列。因爲你想要的東西比md5短(16bytes,而你建議獲得10bytes的長度) - 準備好碰撞。 – zerkms 2011-01-08 13:01:07
如果你會解釋_爲什麼你需要這個 - 你會得到更好的答案 - 爲了什麼目的,它將如何使用以及由誰來使用? – 2011-01-08 13:43:56