Как получить короткую уникальную строку для номера телефона?

У меня в БД добавляется много тысяч телефонов вида 79*********.
Мне нужно для каждого из них рассчитывать уникальную строку, по которой можно идентифицировать этот телефон. Строку желательно сделать максимально короткой.
Есть идеи?
  • Вопрос задан
  • 550 просмотров
Решения вопроса 1
longclaps
@longclaps
Переведи в целое число и запакуй в base64. На питоне это можно сделать так:
import base64, re

def enc(telstr):
    s = re.sub(r'\D', '', telstr)
    if len(s) < 10 or len(s) == 11 and s[0] not in '78' or len(s) > 11:
        raise ValueError('"%s" не похоже на телефонный номер' % telstr)
    x, l = int(s[-10:]), bytearray(b'\0\0\0\0\0')
    for i in range(4, -1, -1):
        x, rest = divmod(x, 256)
        l[i] = rest
    return base64.encodebytes(l)[:7].decode('utf-8')

def dec(b64):
    x = 0
    for b in base64.decodebytes(b64.encode('utf-8') + b'=\n'):
        x = x * 256 + b
    return x

s = enc('8(926)123-4567') 
print(s)          # AigDOYc
print(dec(s))     # 9261234567
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
teke_teke
@teke_teke
programador
отбросьте 79 от каждого номера и рассчитайте хэш от оставшейся части
Ответ написан
Комментировать
Отбросьте "79", остается 10^9. Это 30 бит. В алфавите base64 - это 5 символов. Если какие-то из символов base64 Вам не понравятся (плюсик, слеш и т.п.) - замените на более удобные.
Ответ написан
Комментировать
@electronik777
а я бы генерировал salt/соль через /dev/urandom, писал в пользователя, а потом это отправлял в base64 или md5 с короткой ссылкой аля bitly. Ну и индекс для уникальности на это поле с солью.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы