【问题标题】:Python: Performing Modulo on StringsPython:对字符串执行取模
【发布时间】:2015-10-09 13:07:13
【问题描述】:

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

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

不过,这不会平均划分我的字符串,因为 word0、word1 和 word2 是按字母顺序排序的,而且字符串的第一个字符通常是“a”。我可以取字符串的最后一个字母,但不确定它们是否正常分布。

我的问题:有没有一种快速的方法可以对整个字符串执行类似“ord”的操作?我最终计划在字符串的整数表示上运行模 48,并希望该模输出均匀分布在所有 48 个内核上。如果其他人可以提供任何帮助,我将不胜感激。

【问题讨论】:

  • 所以基本上你正在寻找一个好的hash function 我认为你最好的选择是采用现有的实现
  • something_like_ord(whole_string) 应该返回什么?
  • @boardrider md5 是一种加密散列函数,不是您想在类似散列图的结构中使用的函数。

标签: python string hash modulo ord


【解决方案1】:
s = "whatever"  # have a string
h = hash(s)     # obtain its hash
bin = h % 48    # find the bin

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

【讨论】:

  • 谢谢@dlask。我在输入问题的一半时意识到我确实在使用一个好的散列函数。我会接受这个答案并四处寻找hash()的最佳实施@
  • 这不是模板,而是工作代码。 hash 函数由 Python 直接提供。当然,您也可以使用其他哈希函数。
  • @duhaime 请仔细阅读__hash__ 函数的文档。这里最重要的部分是最后一个音符。此外,即使您使用旧的 Python3 版本或 Python 2.7,__hash__ 也不能保证是 deterministic function
  • 谢谢@Alik,这是必不可少的。您是否知道一个快速确定性哈希函数可以帮助创建适合我的 %48 情况的相当均匀的分布?非确定性哈希是不可能的。
  • @duhaime 所有散列必须是确定性函数。加密哈希函数是一个很难恢复的 hash 函数(即,仅在给定哈希值的情况下获取原始输入)。通常它们比非加密哈希慢(参见 xxHash 主页上的比较表 - MD5、SHA1 是加密哈希)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2015-07-13
相关资源
最近更新 更多