Python:对字符串执行模运算

4

我有几十亿个格式为word0.word1.word2的字符串,希望对这些字符串执行模n操作,以便将每个字符串馈送给数据库编写器进行存储。我知道可以对字符串的第一个字符执行模10操作,如下所示:

for i in ["a.b","c.d"]: 
    print ord(i[0]) % 10

然而,这些字符串无法均匀地进行划分,因为word0、word1和word2按字母顺序排序,并且字符串的第一个字符往往是"a"。我可以取字符串的最后一个字母,但不确定它们是否符合正态分布。

我的问题:是否有一种快速的方法来对整个字符串执行类似于“ord”的操作?我最终计划在字符串的整数表示上运行模48,并希望该模输出在所有48个核心上均匀分布。我将非常感谢其他人提供的任何帮助。


1
基本上,您正在寻找一个好的哈希函数。我认为您最好的选择是采用现有的实现。 - Konstantin
something_like_ord(whole_string) 应该返回什么? - Finwood
https://dev59.com/GW435IYBdhLWcg3wpxyw - boardrider
@boardrider md5是一种加密哈希函数,不适合在类似哈希映射结构中使用。 - Konstantin
1个回答

4
s = "whatever"  # have a string
h = hash(s)     # obtain its hash
bin = h % 48    # find the bin

更新:Python内置的hash函数仅针对单个进程提供确定性值。如果您想在数据库中保留此信息(直接或间接),则必须使用显式哈希函数,其中不包括任何随机数据。(感谢@Alik)

感谢@dlask。我在打出问题的一半时意识到我确实需要一个好的哈希函数。我会接受这个答案,并寻找hash()的最佳实现。 - duhaime
@duhaime 请仔细阅读 __hash__ 函数的文档。这里最重要的部分是最后的注释。即使您使用旧版本的 Python3 或 Python 2.7,__hash__ 也不能保证是一个确定性函数 - Konstantin
@duhaime 我不确定,但我听说djb2在简单性和速度方面都很不错。 - Konstantin
@Alik,有趣。它不是加密的——它是确定性的吗? - duhaime
1
@duhaime 所有哈希函数都必须是确定性函数。加密哈希函数是一种非常难以还原的哈希函数(即仅通过哈希值获取原始输入很困难)。通常,它们与非加密哈希相比速度较慢(请参见xxHash主页上的比较表 - MD5,SHA1是加密哈希)。 - Konstantin
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接