Có cách nào mà tôi có thể băm một chuỗi ngẫu nhiên thành một số 8 chữ số mà không cần tự thực hiện bất kỳ thuật toán nào không?
Có cách nào mà tôi có thể băm một chuỗi ngẫu nhiên thành một số 8 chữ số mà không cần tự thực hiện bất kỳ thuật toán nào không?
Câu trả lời:
Có, bạn có thể sử dụng được xây dựng trong hashlib module hoặc được xây dựng trong hash function. Sau đó, cắt bỏ tám chữ số cuối cùng bằng cách sử dụng các phép toán modulo hoặc phép toán cắt chuỗi trên dạng số nguyên của hàm băm:
>>> 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
Câu trả lời của Raymond là rất tốt cho python2 (tuy nhiên, bạn không cần abs () cũng như parens khoảng 10 ** 8). Tuy nhiên, đối với python3, có những lưu ý quan trọng. Trước tiên, bạn cần đảm bảo rằng mình đang chuyển một chuỗi được mã hóa. Ngày nay, trong hầu hết các trường hợp, có lẽ tốt hơn là nên tránh xa sha-1 và thay vào đó sử dụng một thứ gì đó như sha-256. Vì vậy, cách tiếp cận hashlib sẽ là:
>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417
Nếu bạn muốn sử dụng hàm băm () thay thế, lưu ý quan trọng là, không giống như trong Python 2.x, trong Python 3.x, kết quả của hash () sẽ chỉ nhất quán trong một quy trình, không phải trên các lệnh gọi python. Xem tại đây:
$ 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
Điều này có nghĩa là giải pháp dựa trên hash () được đề xuất, có thể được rút ngắn thành:
hash(s) % 10**8
sẽ chỉ trả về cùng một giá trị trong một lần chạy tập lệnh nhất định:
#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
Vì vậy, tùy thuộc vào việc điều này có quan trọng trong ứng dụng của bạn hay không (nó đã xảy ra trong ứng dụng của tôi), có thể bạn sẽ muốn tiếp cận với phương pháp dựa trên hashlib.
hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]
phù thủy vẫn sẽ có va chạm
Chỉ để hoàn thành câu trả lời JJC, trong python 3.5.3, hành vi là chính xác nếu bạn sử dụng hashlib theo cách này:
$ 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
Tôi đang chia sẻ việc triển khai giải pháp nodejs của chúng tôi do @Raymond Hettinger triển khai.
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));