首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OverflowError:无法将“int”放入索引大小的整数中

OverflowError:无法将“int”放入索引大小的整数中
EN

Stack Overflow用户
提问于 2018-03-13 08:05:59
回答 1查看 7K关注 0票数 4

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

这是我的密码

代码语言:javascript
运行
复制
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)

然而,当我尝试运行一些测试时,我会得到这个错误。

代码语言:javascript
运行
复制
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

我怎样才能最好地纠正这个错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-13 08:13:01

来自文档

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

这里k==128 so 1<<128

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

代码语言:javascript
运行
复制
>>> random.SystemRandom().getrandbits(128)
135192632488754159854542557748438253357

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

现在,如果您想要生成128个随机字节,则应该这样做:

代码语言:javascript
运行
复制
>>> 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。正如阿马丹所指出的,也许你需要128个比特,而不是字节,所以用range(16)代替。嗯,现在你知道了,你可以适应你的实际需要了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49251077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档