在python中使用散列函数作为命令中的键
我有一个正在创建的项目(在Python3.3中),我正在尝试找出是否有一种高效(或更漂亮的方法)来完成下面的工作 我有一个提取二进制/十六进制字符串的函数,如下所示(仅出于示例目的拆分位组)在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*
- 0000 1111 0002 0001
- 0000 1111 0003 0001
- 0000 1111 0002 0002
- 0000 1110 0002 0001
谢谢你的帮助 假设您实际使用的是示例中的位值,那么为什么不从字典中派生一个字典,该字典具有一个新方法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)的值吗?Pythondict
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
的目的。