Django: Is Base64 of md5 hash of email address under 30 characters?
Question: I am investigating since a few hours the best way to use the Email address
instead of username in Django authentication. This topic has been discussed
many times but the given results are inconsistent.

1) The answer [here](http://stackoverflow.com/questions/778382/accepting-
email-address-as-username-in-django) points to a
[snippet](http://www.davidcramer.net/code/224/logging-in-with-email-addresses-
in-django.html) that distinguishes the username and email simply by having an
'@'char in it. The max length of email and username is not equal though and
not considered in the answer.

2) The second answer - from the same
[link](http://stackoverflow.com/questions/778382/accepting-email-address-as-
username-in-django) \- from S.Lott (13 votes) is doing some black magic with
admin.site. It doesn't make sense to me what the code is doing, is this the
accepted way of doing it short and sweet?

3) Then I found [this solution](http://www.xairon.net/2011/05/django-email-
only-authentication/), which seems almost perfect (and makes sense to me):

    
    
    username = uuid.uuid4().hex[:30]
    

It picks only the first 30 chars of a unique Python generated ID as the
username. But there is still a chance of collision. Then I came across a post
where someone has claimed

> A base64 encoding of an md5 hash has 25 characters

If thats true, couldn't we take the base64 encoding of an md5 hash of the
**email address** and guarantee 100% unique usernames, which are also under 30
character? If this is true, how could this be achieved?

Many Thanks,


Answer: You can do it like this:

    
    
    >>> from hashlib import md5
    >>> h = md5('email@example.com').digest().encode('base64')[:-1]
    >>> _
    'Vlj/zO5/Dr/aKyJiOLHrbg=='
    >>> len(h)
    24
    

You can ignore the last char because it's just a new line. The chance of
collision is the same as the MD5 hash, you don't lose information when you
encode in base64.

    
    
    >>> original = md5('email@example.com').digest()
    >>> encoded = original.encode('base64')
    >>> original == encoded.decode('base64') 
    True
    

