# How to hash a string into 8 digits?

### Question

Is there anyway that I can hash a random string into a 8 digit number without implementing any algorithms myself?

1
66
11/11/2018 9:48:25 PM

Yes, you can use the built-in hashlib modules or the built-in hash function. Then, chop-off the last eight digits using modulo operations or string slicing operations on the integer form of the hash:

``````>>> s = 'she sells sea shells by the sea shore'

>>> # Use hashlib
>>> import hashlib
>>> int(hashlib.sha1(s).hexdigest(), 16) % (10 ** 8)
58097614L

>>> # Use hash()
>>> abs(hash(s)) % (10 ** 8)
82148974
``````
108
4/9/2015 2:17:17 AM

Raymond's answer is great for python2 (though, you don't need the abs() nor the parens around 10 ** 8). However, for python3, there are important caveats. First, you'll need to make sure you are passing an encoded string. These days, in most circumstances, it's probably also better to shy away from sha-1 and use something like sha-256, instead. So, the hashlib approach would be:

``````>>> import hashlib
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417
``````

If you want to use the hash() function instead, the important caveat is that, unlike in Python 2.x, in Python 3.x, the result of hash() will only be consistent within a process, not across python invocations. See here:

``````\$ python -V
Python 2.7.5
\$ python -c 'print(hash("foo"))'
-4177197833195190597
\$ python -c 'print(hash("foo"))'
-4177197833195190597

\$ python3 -V
Python 3.4.2
\$ python3 -c 'print(hash("foo"))'
5790391865899772265
\$ python3 -c 'print(hash("foo"))'
-8152690834165248934
``````

This means the hash()-based solution suggested, which can be shortened to just:

`hash(s) % 10**8`

will only return the same value within a given script run:

``````#Python 2:
\$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543
\$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543

#Python 3:
\$ python3 -c 's="your string"; print(hash(s) % 10**8)'
12954124
\$ python3 -c 's="your string"; print(hash(s) % 10**8)'
32065451
``````

So, depending on if this matters in your application (it did in mine), you'll probably want to stick to the hashlib-based approach.