【发布时间】:2022-04-21 23:52:52
【问题描述】:
出于无聊,我决定用 python 编写一个散列算法。一切正常,但是我有几个问题:
结果相似(例如
hash(1234)与hash(4321)有一个字符差异)有一个重复的序列形成(在较小的输入上更明显)
我使用的大多数值都是随机的,我没有编写哈希算法的经验,但我想试一试。有什么办法可以解决我遇到的 2 个问题吗?
def mash(n):
l = [int(x) for x in list(str(n))]
m = []
for i in range(len(l)):
if pow(len(l) >> 1, (i + 1) << 3) % (i + 1) == 0 and i != 0:
m[-1] = int(str(m[-1]) + str(l[i]))
else:
m.append(l[i])
return m
def hash(content, key=None):
"""Hashes the content (either a string or number"""
o = [0] * 128
if type(content) is float:
while content % 1 != 0:
content = content * 10
content = int(content)
if type(content) is str:
content = int(''.join([str(ord(x)) for x in list(content)]))
if type(content) is int:
content = mash(content)
_ = []
for i in range(len(content)):
_.append((chr(((content[i] * (i << 3)) % 94) + 33)))
# 33 - 126
content = ''.join(_)
elif type(content) is not str:
raise Exception
z = [ord(x) for x in list(content)]
for i in range(len(z)):
if z[i] % 2 == 0:
n = next((i for i, x in enumerate(o) if not x and i % 2 == 0), 0)
else:
n = next((i for i, x in enumerate(o) if not x and i % 2 == 1), 0)
o[n] = content[i]
o = [str(x) for x in o]
o.reverse()
init_n = o.count('0')
while o.count('0') > 5:
n = next((i for i, x in enumerate(o) if x == '0'), None)
o[n] = chr(((pow(init_n >> 1, o.count('0'))) % 94) + 33)
o.reverse()
return ''.join(o)
请注意,key 参数尚未实现。希望在尝试其他功能之前解决现有问题。
【问题讨论】:
-
不幸的是,竭尽全力解决这两个问题会在其他地方产生问题。如果它没有损坏,请不要修复它。
-
虽然我尊重“如果它没有坏,就不要修复它”的态度,但生活中的进步会非常陈旧。这不是我修复现有算法的尝试,而是学习,也许有一天我能够创建一个合适的算法。
-
如果你用你的算法来解释的话会有所帮助。您的功能似乎过于复杂,因此对于非加密应用程序来说太慢了,当然对于加密工作来说它不太可能足够安全。顺便说一句,没有必要做
[int(x) for x in list(str(n))],你可以直接遍历字符串,所以[int(x) for x in str(n)]做同样的工作。此外,pow函数可以将模数作为其可选的第三个参数;执行pow(a, b, m)比执行pow(a, b) % m效率更高。