gpt4 book ai didi

python - 在 Python 2.x 和 3.x 中处理缓冲区

转载 作者:行者123 更新时间:2023-11-28 22:51:21 25 4
gpt4 key购买 nike

尝试在 Python 2.x 和 3.x 中获取文件的粗略哈希值。必须使用此哈希函数 - 不是内置的。

使用

get_file_hash("my-file.txt")

3.x 有效。 2.x报错,因为传入值的类型是'str'。

错误说

    value = content[0] << 7
TypeError: unsupported operand type(s) for <<: 'str' and 'int'

这是代码

def c_mul(a,b):
return eval(hex((int(a) * b) & 0xFFFFFFFF)[:-1])

def get_hash(content):
value = 0
if len(content) > 0:
print (type(content))
print (type(content[0]))
value = content[0] << 7
for char in content:
value = c_mul(1000003, value) ^ char
value = value ^ len(content)
if value == -1:
value = -2
return value

def get_file_hash(filename):
with open(filename, "rb") as pyfile:
return get_hash(pyfile.read())

如何修复 get_hash 或 get_file_hash 以便它在 2.x 和 3.x 上工作?

最佳答案

file.read() 对于以二进制模式打开的文件返回 bytes 在 Python 3 和 str (== 字节) 在 Python 2.

但是迭代 bytes 对象在两个版本中产生不同的结果:

>>> list(b'123') # In Python 3.x, yields `int`s
[49, 50, 51]
>>> list(b'123') # In Python 2.x, yields `string`s
['1', '2', '3']

使用字节数组。迭代它将在两个版本中产生 int

>>> list(bytearray(b'123')) # Python 3.x
[49, 50, 51]
>>> list(bytearray(b'123')) # Python 2.x
[49, 50, 51]

def c_mul(a,b):
return (a * b) & 0xFFFFFFFF

def get_hash(content):
content = bytearray(content) # <-----
value = 0
if len(content) > 0:
value = content[0] << 7
for char in content:
value = c_mul(1000003, value) ^ char
value = value ^ len(content)
if value == -1:
value = -2
return value

def get_file_hash(filename):
with open(filename, "rb") as pyfile:
return get_hash(pyfile.read())

顺便说一句,我修改了 c_mul 不使用 hexeval。 (我假设您使用它来删除 Python 2.x 中的尾随 L)。

>>> hex(289374982374)
'0x436017d0e6L'
# ^

关于python - 在 Python 2.x 和 3.x 中处理缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21619915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com