Kendim herhangi bir algoritma uygulamadan rastgele bir dizeyi 8 basamaklı bir sayıya hash edebilir miyim?
Kendim herhangi bir algoritma uygulamadan rastgele bir dizeyi 8 basamaklı bir sayıya hash edebilir miyim?
Yanıtlar:
Evet, yerleşik hashlib modüllerini veya yerleşik hash işlevini kullanabilirsiniz. Ardından, hash'in tamsayı biçiminde modulo işlemlerini veya dize dilimleme işlemlerini kullanarak son sekiz basamağı kesin:
>>> 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
Raymond'ın cevabı python2 için harika (yine de abs () ya da 10 ** 8 civarında parenlere ihtiyacınız yok). Bununla birlikte, python3 için önemli uyarılar vardır. Öncelikle, kodlanmış bir dizeyi ilettiğinizden emin olmanız gerekir. Bugünlerde çoğu durumda sha-1'den uzak durmak ve bunun yerine sha-256 gibi bir şey kullanmak muhtemelen daha iyidir. Dolayısıyla, hashlib yaklaşımı şöyle olacaktır:
>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417
Bunun yerine hash () işlevini kullanmak istiyorsanız, önemli uyarı, Python 2.x'in aksine, Python 3.x'te, hash () sonucunun python çağrılarında değil, yalnızca bir işlem içinde tutarlı olacağıdır. Buraya bakın:
$ 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
Bu, önerilen hash () tabanlı çözüm anlamına gelir ve şu şekilde kısaltılabilir:
hash(s) % 10**8
yalnızca belirli bir komut dosyası çalıştırmasında aynı değeri döndürür:
#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
Bu nedenle, uygulamanızda bunun önemli olup olmadığına bağlı olarak (benimkinde de vardı), muhtemelen hashlib tabanlı yaklaşıma bağlı kalmak isteyeceksiniz.
hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]
cadı da kullanabilirsiniz, yine de çarpışmalar
Sadece JJC cevabını tamamlamak için, python 3.5.3'te hashlib'i bu şekilde kullanırsanız davranış doğrudur:
$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded
$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded
$ python3 -V
Python 3.5.3
@Raymond Hettinger tarafından uygulanan çözümün nodejs uygulamasını paylaşıyorum.
var crypto = require('crypto');
var s = 'she sells sea shells by the sea shore';
console.log(BigInt('0x' + crypto.createHash('sha1').update(s).digest('hex'))%(10n ** 8n));