【问题标题】:OverflowError: cannot fit 'int' into an index-sized integer溢出错误:无法将“int”放入索引大小的整数中
【发布时间】:2018-08-21 09:48:21
【问题描述】:

为了确保密码始终在数据库中存储、散列和加盐,我决定使用一个描述符,它会在提供密码时自动散列密码,例如 user.password = "jinja125"。

这是我的代码

from random import SystemRandom
from backports.pbkdf2 import pbkdf2_hmac, compare_digest

# ...snip...    

@password.setter
def password(self, value):
    # When a user is first created, give them a salt
    if self._salt is None:
        self._salt = bytes(SystemRandom().getrandbits(128))
    self._password = self._hash_password(value)

但是当我尝试运行一些测试时,我得到了这个错误。

File "C:\Users\User\flask-python\site-tracker\app\users\models.py", line 34, in password
    self._salt = bytes(random.SystemRandom().getrandbits(simple_bit_counts))
OverflowError: cannot fit 'int' into an index-sized integer

我怎样才能最好地解决这个错误?

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    来自documentation

    random.getrandbits(k) 返回一个带有 k 个随机位的 python long int。

    这里k==128所以1<<128

    检查您尝试从(例如)创建bytes 数组的大小值:

    >>> random.SystemRandom().getrandbits(128)
    135192632488754159854542557748438253357
    

    这对于数组索引来说太大了,更不用说内存了。您可能希望大幅降低您的价值。我想你的意思是2**7(7 位随机)不是1<<128

    现在,如果您想生成 128 个随机 字节,您可以这样做:

    >>> bytes(random.randrange(0,255) for _ in range(128))
    b'\xc9\x8fC\t\xe0\xc8\x8a5\xe4\xafb\xb5c.\x91\xea\x9aqUL\x11\x8d\xe4\xe3W\x87\xecM\xf8K\xa8\xf8\xbb\xb5 \x14H\xda\x1d]L\x13[n*\x87W\xd8\x90v\xfd\x8cQ\xdcY\xe4^\x95h8\xdc\'\x8e\xcb:\xea\xfbF\xf1zh8\xf63\x18WeV\xc6)\xce\xf9*w>\x83e\x0b#"\xf2\x97\xcf\xc2!\xddj\xb2\xbePl\xa2\r\xa7T\x8f\x14\x13\xa4\x1c\xeax\xacMJ2\x88A,\x11\xdev\xe1\xf8\x9b\x12\xd9c'
    

    无需为此致电getrandbits。正如 Amadan 所说,也许你想要 128 位,而不是字节,所以改用 range(16)。好了,既然你知道了,你就可以根据自己的实际需要进行调整了。

    【讨论】:

    • 他的意思可能是128,但误用了bytes - 我想他想要b'????????????????',一个十六字节的字符串,而不是135192632488754159854542557748438253357-length 数组。
    • 是的,我不知道用户到底想要什么,但数量级错误:)...
    • 这在 Python3 中也有效:SystemRandom().getrandbits(128).to_bytes(16, 'little'),与 OP 的最初想法有点接近。 (还要注意,128 个随机 bits16 个随机字节,而不是 128 个)
    • @Amadan 是真的,又是真的。请注意,您可以发布有关该问题的答案。由于我不知道该功能,因此我不会将其放在答案中。
    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多