2010-04-08 11 views
10

Pracuję w python na appengine.Wygeneruj skrótu o stałej długości w pythonie dla parametru adresu URL

staram się stworzyć coś, co jest równoważne z „v” wartość w youtube url (http://www.youtube.com/watch?v=XhMN0wlITLk) za zdobycie konkretnych podmiotów. Automatyczny magazyn danych generuje klucz, ale jest o wiele za długi (34 cyfry). Eksperymentowałem z hashlibem, aby zbudować własne, ale znowu otrzymałem długi ciąg. Chciałbym zachować go poniżej 11 cyfr (nie mam do czynienia z ogromną liczbą podmiotów), a litery i liczby są dopuszczalne.

Wygląda na to, że powinno istnieć całkiem standardowe rozwiązanie. Prawdopodobnie po prostu tęsknię za tym.

Odpowiedz

8

Możesz użyć wygenerowanego automatycznie integer id klucza do wygenerowania skrótu. Prostym sposobem generowania skrótu byłaby konwersja liczby całkowitej na wartość bazową62 (alfanumeryczną). Aby pobrać obiekt, po prostu przekonwertuj na dziesiętny z powrotem z base62 i użyj get_by_id, aby pobrać obiekt.

Oto prosta funkcja konwersji base62, którą użyłem w jednej z moich aplikacji.

import string 
alphabet = string.letters + string.digits 
max = 11 

def int_to_base62(num): 
    if num == 0: 
     return alphabet[0] 

    arr = [] 
    radix = len(alphabet) 
    while num: 
     arr.append(alphabet[num%radix]) 
     num /= radix 
    arr.reverse() 
    return (alphabet[0] * (max - len(arr))) + ''.join(arr) 

def base62_to_int(str): 
    radix = len(alphabet) 
    power = len(str) - 1 
    num = 0 
    for char in str: 
     num += alphabet.index(char) * (radix ** power) 
     power -= 1 
    return num 
+0

Te dwa linki były bardzo pomocne. Problemem jest teraz znalezienie idealnego sposobu kodowania i dekodowania w base62. Zrobiłem trochę czytania, czy istnieje metoda, którą sugerujesz? – LeRoy

+1

można użyć podstawowych technik konwersji liczby bazowej. Aby ustawić stałą wartość skrótu, wystarczy dodać kilka dopełnień zerowych do numeru base62. – z33m

5

Jeśli masz wartość, która jest unikalna dla każdego obiektu, możesz uzyskać krótszą wersję poprzez haszowanie i obcinanie. Hashy takie jak md5 lub sha1 są dobrze wymieszane, co oznacza, że ​​każdy bit na wyjściu ma 50% szans na przewrócenie, jeśli zmienisz jeden bit na wejściu. Jeśli skrócisz hash, zwiększasz szanse na kolizję, ale możesz dokonać kompromisu między długością a kolizją.

Kodowanie base64 z bezpiecznym adresem URL jest dobrym rozwiązaniem do przekształcania haszowania w tekst.

orig_id = 'weiowoeiwoeciw0eijw0eij029j20d232weifw0jiw0e20d2' # the original id 
shorter_id = base64.urlsafe_b64encode(hashlib.md5(orig_id).digest())[:11] 

Z base64, masz 6 bitów informacji na charakterze, 11 znaków daje 66 bitów wyjątkowości lub 1 w 2 ** 66 szansę kolizji.

+0

czy istnieje powód, dla którego wybrałbyś konwersję base64 ponad base62, jak sugerują powyższe? – LeRoy

+0

Wydaje się, że Base64 zawsze zawiera "=", który tak naprawdę nie jest bezpieczny. – LeRoy

+0

Używam base64 ponad base62 tylko dlatego, że jest bardziej znany. = = Dopełnienie. I tak cię ścinasz, prawda? –

Powiązane problemy