Apakah ada yang bisa saya hash string acak menjadi angka 8 digit tanpa menerapkan algoritma sendiri?
Apakah ada yang bisa saya hash string acak menjadi angka 8 digit tanpa menerapkan algoritma sendiri?
Jawaban:
Ya, Anda dapat menggunakan modul hashlib built-in atau fungsi hash built-in . Kemudian, potong delapan digit terakhir menggunakan operasi modulo atau operasi pemotongan string pada bentuk integer dari 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
Jawaban Raymond sangat bagus untuk python2 (meskipun, Anda tidak memerlukan abs () atau parens sekitar 10 ** 8). Namun, untuk python3, ada peringatan penting. Pertama, Anda harus memastikan bahwa Anda meneruskan string yang dienkode. Hari-hari ini, dalam banyak situasi, mungkin juga lebih baik untuk menghindar dari sha-1 dan menggunakan sesuatu seperti sha-256. Jadi, pendekatan hashlib adalah:
>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417
Jika Anda ingin menggunakan fungsi hash (), peringatan pentingnya adalah, tidak seperti di Python 2.x, di Python 3.x, hasil hash () hanya akan konsisten dalam suatu proses, bukan di seluruh pemanggilan python. Lihat disini:
$ 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
Ini berarti solusi berbasis hash () disarankan, yang dapat disingkat menjadi hanya:
hash(s) % 10**8
hanya akan mengembalikan nilai yang sama dalam menjalankan skrip tertentu:
#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
Jadi, tergantung pada apakah ini penting dalam aplikasi Anda (itu terjadi di aplikasi saya), Anda mungkin ingin tetap menggunakan pendekatan berbasis hashlib.
hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]
penyihir yang masih akan bertabrakan
Sekadar melengkapi jawaban JJC, di python 3.5.3 perilakunya sudah benar jika menggunakan hashlib seperti ini:
$ 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
Saya membagikan implementasi nodejs kami dari solusi seperti yang diterapkan oleh @Raymond Hettinger.
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));