2012-12-12 95 views
-1

我有一個數據庫表,每行都有其唯一的標識(RowID)。將唯一編號映射到6個字符的唯一字符串

是否有一種很好的方法將此RowID轉換爲長度始終爲6個字符的唯一鍵。唯一的關鍵字符可以是{A-Za-z0-9}。唯一鍵的一個例子是:a5Fg3A。

當然我知道只有一定數量的密鑰可以使用這種方法生成,但這對我的情況無關緊要。

我已經想了很多關於這個,但我不能想出一個算法,能夠正確地做到這一點。

我有一個想法是: 唯一鍵= ROWID 如果ROWID是比100000低則在它的前面附加0,例如: 123變爲00 1變成000001

然後在數字範圍從100000到900000我會將第一個數字替換爲一個字符串,例如0 = a,1 = b,2 = c,...,9 = j。

然後,我可以做大寫字母一樣,等

我的問題是,我的算法是非常有限的,生成密鑰的數量少,因爲它不會利用所有可能的字符。

所以基本上我應該能夠生成56800235584獨特的密鑰,假設每個密鑰的長度爲6,並利用這些字符{A-Za-z0-9}。

A-Z = 26個字符 A-Z = 26個字符 0-9 = 10個字符

因此,它是62^6個獨特的密鑰。

任何反饋將如何這可能是正確完成(甚至是最優的):-)

謝謝理解!

+2

難道你不是在尋找一種方法將一個數字轉換爲它的base-62表示嗎? –

+0

這是正確的,那就是訣竅。謝謝! – raRaRa

回答

1

如果您想讓A-Z a-z 0-9成爲字母表,如您注意到的那樣,您的基數爲62的數字系統。因此在62位編碼獨特的rowid,有一個標準的算法來做到這一點。如果您的應用程序允許(需要)它,您可以添加更多的可打印字符,如'+','/','!','@'..因此您可以獲得更多獨特性。現成的答案是base64編碼,廣泛使用。

+0

好點。如果數字的編碼值小於6個字符,我會安全地在其前面添加一些字符嗎? – raRaRa

+0

無論您選擇哪個數字基地,它都會有一個零...如果您需要固定長度,您可以在左側填充零。如果您使用的是普通數據庫,那麼在使用可變長度列(varchar)時不會保存,因此您也可以使用它。 – user1666959

1

您可以對您的ID進行排序,然後將增加的詞典字符串附加到每個字符串。

簡單的例子,其中的字母只有{a,b}(只簡單),並Ids= [20,1,7,90]:依賴

sort: Ids = [1,7,20,90] 
Attach increasing strings: 
1 = aaaaaa 
7 = aaaaab 
20 = aaaaba 
90 = 0000bb 

如果你想把它當作某種類型的哈希函數,而不是數據 - 你可以只是使用與編號相同的二進制編碼,並將其相似地轉換(即1 = aaaaaa,2 = aaaaab,3 = aaaaac ...)
[編輯:基本上與base-62建議的相同@HighPerformanceMark評論]


第一種方法的優點:可以讓你應付高達62^6個號碼,無論他們尺寸,而第二種方法不允許這樣做。

然而,第二種方法允許您從數字到字符串進行一致的轉換,無論具體數據如何。

+0

感謝您的好評。事實上,將行ID轉換爲base62的技巧:-) – raRaRa

0

有很多方法可以做到這一點 - 挑戰是選擇一個「最好」的任何標準。一些例子,但遠沒有窮盡的(一些已經在其他地方的建議):

  • 墊遞增順序
  • 基地-62表示(注:基64是常用的,可能甚至已經擁有代碼它在你手頭的任何庫中)
  • 截斷加密哈希(很慢,但有一些其他屬性可能是有用的,具體取決於你爲什麼需要這樣做;如果你只需要做一次,性能命中可能是值得的)
  • 其他不一定加密哈希函數,可能會相當快
  • ......
相關問題