2012-09-24 16 views
7

Bir Alfasayısal dizeden bir UNIQUE kimliği (yalnızca int) oluşturmanız gerekiyor.Alfasayısal Dize'nden Benzersiz Kimlik Oluşturun

örn. Güvenlik kimliğim var = 'ABC123DEF' Eşsiz kimliğin her zaman sabit olması için benzersiz bir kimlik (yalnızca int) "güvenlik kimliği" üretebilmem gerekir.

örn. Güvenlik Kimliği: abc123def Int ID: 9463456892

Yani Veritabanında Int kimliğini saklamak ve Int Kimliği her zaman güvenlik kimliğini başvurabilir söyledi.

Bazı Örnekler: PBG_CD_20120214_.2 | 201202-CMG188963_T | PBG_TD_20120306_.0001 3 örnekler: -PIPE ayrılmış

+0

Hashing'e bak. – SLaks

+0

Çok spesifiksin, bir int olmalı, ama int tanımla? Kullandığınız sayı, uzun bir süre uysa da, genellikle 32 bitlik olan geleneksel bir int için çok büyük. Sayısal kimliğin boşlukları nelerdir? –

+0

Merhaba Jimmy Uzun olabilir int. Bu şekilde girmeliyim. Oluşturulan kimlik "Numberic (0 - 9)" olmalıdır. – Anshul

cevap

1

Her bir karakteri iki basamaklı bir sayı olarak 0-9 arası bir sayı olarak, kendileri de 10-35 olarak A-Z olarak kodlayabilirsiniz.

Örneğin, 9AC8 olurdu 09 10 12 08 = 09101208.

DÜZENLEME: az sayıda Eğer (Java tarzı psuedocode ile) bu yaklaşımı kullanabilirsiniz İçin:

char[] availableChars = ['A', 'B', ... , '0', ... '9', '-', '_', '.']; 
long hash = 0; 
long base = 1; 
for (char c in string.toCharArray()) 
    for (int key=0; key < availableChars.length; key++) 
     if (availableChars[key] != c) 
      continue; 
     hash += base*key; 
     base = base*availableChars.length 

return hash; 
+0

Alfanümerik bir String'im var: Like "201202-CMG277440_T" – Anshul

+0

Numaranızın ne kadar büyük olabileceğine dair bir sınır var mı? – redolent

+0

Hayır - Sayının ne kadar büyük olabileceğine dair bir sınırlama yok. – Anshul

21

Hemen kullanmak Java karma algoritması. % 100 benzersiz ancak bir üs olarak kullanmak ve çok daha küçük çarpışma sette benzersizliği garanti bir şey ekleyebilir değil:

çarpışma% 100 önlemek için
public static int hash(String s) { 
    int h = 0; 
    for (int i = 0; i < s.length(); i++) { 
     h = 31 * h + s.charAt(i); 
    } 
    return h; 
} 

, sen daha büyük bir asal sayı ihtiyaç Karakterleriniz arasında daha geniş fark. 7-bit ASCII için 128'den daha yüksek bir şeye ihtiyacınız var. Yani 31 yerine 131 (128'den sonraki asal sayı) kullanın. Kontrol etmediğim kısım, üretilen karmanın uzun inişlerinizin boyutundan daha büyük olması. Ama oradan alabilirsin ...

+0

. İzin ver deneyeyim. Çok teşekkürler. – Anshul

+3

Çalışıyorsa, topluluğun yararına olan cevabı onaylamayı unutmayın. – mprivat

İlgili konular