在python中使用散列函数作为命令中的键

在python中使用散列函数作为命令中的键,python,python-3.x,Python,Python 3.x,我有一个正在创建的项目(在Python3.3中),我正在尝试找出是否有一种高效(或更漂亮的方法)来完成下面的工作 我有一个提取二进制/十六进制字符串的函数,如下所示(仅出于示例目的拆分位组) 0000 1111 0002 0001 0000 1111 0003 0001 0000 1111 0002 0002 0000 1110 0002 0001 现在,我想做的是能够将它们传递到函数中,然后根据第二组位和第四组位(即操作码)中的值将它们激发到方法中 如;一种哈希函数,它将检查(*1111*

我有一个正在创建的项目(在Python3.3中),我正在尝试找出是否有一种高效(或更漂亮的方法)来完成下面的工作

我有一个提取二进制/十六进制字符串的函数,如下所示(仅出于示例目的拆分位组)

  • 0000 1111 0002 0001
  • 0000 1111 0003 0001
  • 0000 1111 0002 0002
  • 0000 1110 0002 0001
现在,我想做的是能够将它们传递到函数中,然后根据第二组位和第四组位(即操作码)中的值将它们激发到方法中 如;一种哈希函数,它将检查(*1111*0001)是否匹配,然后返回与这些位相关的函数

我有使用哈希表字典的想法,但是我不完全确定如何将密钥作为掩码

虽然我可以用键11110001和我想要返回的函数的值创建一个字典,然后只需对[4:8][12:16]进行压缩和传递就可以了,但我想知道是否有办法为键创建一个哈希函数。(如果有意义的话)而不进入类并重写哈希函数,然后传入该函数

可能是某种形式的数据结构,用于存储正则表达式键并在任何有效输入上执行它虽然我可以创建一个,但我想知道是否有某种形式的内置功能我丢失了(只是为了不重新发明轮子)

希望这是有意义的!
谢谢你的帮助

假设您实际使用的是示例中的位值,那么为什么不从字典中派生一个字典,该字典具有一个新方法getmasked,该方法在查找值之前屏蔽该值…

绝对没有理由避免使用
\uuuuuuuuuhash\uuuuuuu>和
\uuuuuueq\uuuu
实现一个小类。字典确实支持自定义哈希函数,这就是实现该功能的方法:

KEY_MASK = 0xf0f0  # or whichever mask you need

class Key(object):
    __slots__ = 'num',
    def __init__(self, num):
        self.num = num
    def __hash__(self):
        return hash(self.num & KEY_MASK)
    def __eq__(self, other):
        return self.num & KEY_MASK == other.num & KEY_MASK
    def __ne__(self, other):
        return not self == other

我不明白你在问什么。难道你不能简单地使用字符串
“1111 0001”
作为字典中的一个键吗?是的,在当前情况下,这将起作用!但是我想要一种比拆分和浓缩字符串更高效、更干净的方法——更灵活的方法,比如散列函数,以防我需要像???这样的东西????将来是1111???0001。这些真的是字符串吗?将它们表示为int并使用位运算似乎更为自然。另外,如果你想把位图映射到操作,你可能想考虑使用一个列表。是的,我从一个文本文件抓取它们,所以它们现在被表示为字符串。我考虑过使用逐位操作,只是“和”屏蔽它们,但我不知道是否有内置功能允许我在键上设置自己的hashfunction。你能解释一下关于考虑使用列表的更多信息吗例如,你的意思是将索引设置为11110001(22813045)的值吗?Python
dict
s调用
\uuuuuuhash\uuuuuuu
方法,这样你就没有很多选择了:1)将字符串转换为其他内置类型并将其用作键(例如,就像我建议的那样,使用原始字符串的某个片段作为键),或者2)使用其自定义
\uuuuuu散列\uuuuu
方法创建自定义对象。我仍然不明白你想如何使用这些东西,如果没有更多的上下文,我真的不知道什么更好。好主意,那么这只需要在调用基本字典方法之前对字典进行子类化并重写get方法来执行哈希函数?在这种情况下,实现一个MutableMapping类会实现我想要的吗?谢谢你的帮助!我想这是有道理的,它并不是真正的资源密集型——但是我不敢创建一个键类,因为一次内存中可能有大约10k-320k+的对象,为了效率起见,我宁愿减少内存开销。我来自C语言背景,我的思维方式一直是除非必要,否则不要使用对象,而是将处理原语的逻辑移到一个单例子类中来处理它。(比如一个带有get散列方法的子类字典)这似乎是最简单的方法。谢谢@Nathan我已经修改了这个类,使用
\uuuuu插槽
来减少内存使用(没有
\uuuuuuu指令
和weakref开销)。我认为一个人的C本能不会很好地遗传给Python。除非你能证明你会有内存问题,否则你应该首先尝试惯用的解决方案(带有优化提示,如
\uuuu插槽\uuuuu
),然后,如果有问题,就对其进行优化。请注意,在python3.3中,object
\uu dict\uuu
可以共享密钥,因此所使用的内存量无论如何都非常小。避免过早优化@Bakuriu密钥共享在这里没有帮助,因为所有
Key
对象的dict都有一个条目,这是非常低效的(更不用说即使创建一个空的
dict
也会消耗内存)。将
\uuuuuu slots\uuuuu
添加到一个实例众多且用于特定目的的类中并不是过早的优化-这正是
\uuuuuu slots\uu
的目的。