- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如许多人所指出的,Python 的 hash
不再一致(从 3.3 版开始),作为随机 PYTHONHASHSEED
现在默认使用(解决安全问题,如 this excellent answer 中所述)。
但是,我注意到一些对象的散列仍然是一致的(无论如何从 Python 3.7 开始):包括 int
, float
, tuple(x)
, frozenset(x)
(只要 x
产生一致的哈希值)。例如:
assert hash(10) == 10
assert hash((10, 11)) == 3713074054246420356
assert hash(frozenset([(0, 1, 2), 3, (4, 5, 6)])) == -8046488914261726427
这总是真实的并且有保证吗?如果是这样,预计会保持这种状态吗?是
PYTHONHASHSEED
仅适用于对字符串和字节数组的散列加盐?
{key: tuple(ints)}
.在那个系统中,键是文件名的集合,元组是
os.stat_result
的子集。 ,例如
(size, mtime)
与他们有关。该系统用于根据检测差异做出更新/同步决策。
fsd
”,一个紧凑的表示如下:
def fsd_hash(fsd: dict):
return hash(frozenset(fsd.items()))
它非常快,并产生一个 int 来表示整个 dict(具有顺序不变性)。如果在
fsd
中有任何内容dict 更改,很可能哈希会不同。
hash
仅在单个 Python 实例中保持一致,这使得主机无法比较它们各自的哈希值。将完整缓存(
{location_name: fsd_hash}
)保留到磁盘以在重新启动时重新加载也是无用的。
PYTHONHASHSEED=0
调用。 ,而且,据我所知,一旦 Python 实例启动,就无法更改此设置。
hashlib.sha1
或类似计算一致性哈希。这比较慢,我不能直接使用 frozenset
技巧:在更新哈希器时,我必须以一致的顺序遍历 dict(例如,通过键排序,慢)。在我对真实数据的测试中,我看到速度下降了 50 倍以上。int
, tuple(int)
和 frozenset(tuple(int))
产生一致的哈希值,但是:这是否有保证,如果是这样,我可以期望这种情况持续多久?hash(frozenset(some_dict.items()))
编写一致的哈希替换是什么好方法?当 dict 包含各种类型和类时?我可以实现自定义
__hash__
(一致的)对于我拥有的类,但我不能覆盖
str
的哈希例如。我想到的一件事是:
def const_hash(x):
if isinstance(x, (int, float, bool)):
pass
elif isinstance(x, frozenset):
x = frozenset([const_hash(v) for v in x])
elif isinstance(x, str):
x = tuple([ord(e) for e in x])
elif isinstance(x, bytes):
x = tuple(x)
elif isinstance(x, dict):
x = tuple([(const_hash(k), const_hash(v)) for k, v in x.items()])
elif isinstance(x, (list, tuple)):
x = tuple([const_hash(e) for e in x])
else:
try:
return x.const_hash()
except AttributeError:
raise TypeError(f'no known const_hash implementation for {type(x)}')
return hash(x)
最佳答案
广泛问题的简短回答 :除了 x == y
的总体保证之外,没有对哈希稳定性做出明确的保证。要求 hash(x) == hash(y)
.有一个含义是x
和 y
两者都在程序的同一运行中定义(您不能执行 x == y
,其中其中一个显然不存在于该程序中,因此不需要保证跨运行的散列)。
特定问题的更长答案:
Is [your belief that
int
,float
,tuple(x)
,frozenset(x)
(forx
with consistent hash) have consistent hashes across separate runs] always true and guaranteed?
sys.hash_info
provides the various constants ,并且它们将在该解释器上保持一致,但是在不同的解释器上(CPython 与 PyPy,64 位构建与 32 位构建,甚至 3.n 与 3.n+1)它们可能不同(记录为不同在 64 位与 32 位 CPython 的情况下),因此散列将无法在具有不同解释器的机器之间移植。
tuple
的算法不做任何保证和
frozenset
;我想不出他们在运行之间改变它的任何原因(如果底层类型被播种,
tuple
和
frozenset
从中受益而无需任何更改),但他们可以并且确实改变了发布之间的实现CPython 的(例如
in late 2018 they made a change to reduce the number of hash collisions in short tuple
s of int
s and float
s),所以如果你存储了
tuple
的哈希值s 来自 3.7,然后计算相同
tuple
的哈希值s 在 3.8+ 中,它们不会匹配(即使它们会在 3.7 的运行之间或 3.8 的运行之间匹配)。
If so, is that expected to stay that way?
int
的种子哈希值s(并且通过扩展,对于所有数字类型,以保留数字散列/相等保证),原因与他们为
str
播种散列的原因相同。/
bytes
等。主要障碍是:
int
s 转换为 str
,然后再将它们用作 key )。 Is the
PYTHONHASHSEED
only applied to salt the hash of strings and byte arrays?
str
和
bytes
,它适用于许多随机事物,它们根据
str
的哈希值实现了自己的哈希值。或
bytes
,通常是因为它们已经可以自然地转换为原始字节并且通常用作
dict
中的键s 由面向 Web 的前端填充。我所知道的副手包括
datetime
的各种类别。模块(
datetime
、
date
、
time
,尽管这实际上并未在模块本身中记录),以及只读
memoryview
s of 具有字节大小的格式(其中
hash equivalently to hashing the result of the view's .tobytes()
method)。
What would be a good way to write a consistent hash replacement for
hash(frozenset(some_dict.items()))
when thedict
contains various types and classes?
const_hash
如
a single dispatch function , 使用方法与您相同
hash
本身。这避免了在一个地方定义一个必须处理所有类型的函数;您可以拥有
const_hash
默认实现(它只依赖于
hash
对于那些具有已知一致哈希值的东西)在一个中心位置,并为你知道在那里不一致(或可能包含不一致的东西)的内置类型提供额外的定义,而仍然允许人们通过导入您的
const_hash
来注册他们自己的单分派(dispatch)功能,从而无缝地扩展它涵盖的内容集。并使用
@const_hash.register
为他们的类型装饰实现.它与您提出的
const_hash
的效果没有显着差异,但它更易于管理。
关于Python一致性哈希替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64344515/
我正在尝试 grep conf 文件中所有不以 开头的有效行 哈希(或) 任意数量的空格(0 个或多个)和一个散列 下面的正则表达式似乎不起作用。 grep ^[^[[:blank:]]*#] /op
我正在使用哈希通过 URL 发送 protected 电子邮件以激活帐户 Hash::make($data["email"]); 但是哈希结果是 %242y%2410%24xaiB/eO6knk8sL
我是 Perl 的新手,正在尝试从文本文件创建散列。我有一个代码外部的文本文件,旨在供其他人编辑。前提是他们应该熟悉 Perl 并且知道在哪里编辑。文本文件本质上包含几个散列的散列,具有正确的语法、缩
我一直在阅读 perl 文档,但我不太了解哈希。我正在尝试查找哈希键是否存在,如果存在,则比较其值。让我感到困惑的是,我的搜索结果表明您可以通过 if (exists $files{$key}) 找到
我遇到了数字对映射到其他数字对的问题。例如,(1,2)->(12,97)。有些对可能映射到多个其他对,所以我真正需要的是将一对映射到列表列表的能力,例如 (1,2)->((12,97),(4,1))。
我见过的所有 Mustache 文档和示例都展示了如何使用散列来填充模板。我有兴趣去另一个方向。 EG,如果我有这个: Hello {{name}} mustache 能否生成这个(伪代码): tag
我正在尝试使用此公式创建密码摘要以获取以下变量,但我的代码不匹配。不确定我做错了什么,但当我需要帮助时我会承认。希望有人在那里可以提供帮助。 文档中的公式:Base64(SHA1(NONCE + TI
我希望遍历我传递给定路径的这些数据结构(基本上是目录结构)。 目标是列出根/基本路径,然后列出所有子 path s 如果它们存在并且对于每个子 path存在,列出 file从那个子路径。 我知道这可能
我希望有一个包含对子函数的引用的散列,我可以在其中根据用户定义的变量调用这些函数,我将尝试给出我正在尝试做的事情的简化示例。 my %colors = ( vim => setup_vim()
我注意到,在使用 vim 将它们复制粘贴到文件中后尝试生成一些散列时,散列不是它应该的样子。打开和写出文件时相同。与 nano 的行为相同,所以一定有我遗漏的地方。 $ echo -n "foo"
数组和散列作为状态变量存在限制。从 Perl 5.10 开始,我们无法在列表上下文中初始化它们: 所以 state @array = qw(a b c); #Error! 为什么会这样?为什么这是不允
在端口 80 上使用 varnish 5.1 的多网站设置中,我不想缓存所有域。 这在 vcl_recv 中很容易完成。 if ( req.http.Host == "cache.this.domai
基本上,缓存破坏文件上的哈希不会更新。 class S3PipelineStorage(PipelineMixin, CachedFilesMixin, S3BotoStorage): pa
eclipse dart插件在“变量” View 中显示如下内容: 在“值”列中可见的“id”是什么意思? “id”是唯一的吗?在调试期间,如何确定两个实例是否相同?我是否需要在所有类中重写toStr
如何将Powershell中的命令行参数读入数组?就像是 myprogram -file file1 -file file2 -file file3 然后我有一个数组 [file1,file2,fil
我正尝试在 coldfusion 中为我们的安全支付网关创建哈希密码以接受交易。 很遗憾,支付网关拒绝接受我生成的哈希值。 表单发送交易的所有元素,并发送基于五个不同字段生成的哈希值。 在 PHP 中
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我在这里看到了令人作呕的类似问题,但没有一个能具体回答我自己的问题。 我正在尝试以编程方式创建哈希的哈希。我的问题代码如下: my %this_hash = (); if ($user_hash{$u
我正尝试在 coldfusion 中为我们的安全支付网关创建哈希密码以接受交易。 很遗憾,支付网关拒绝接受我生成的哈希值。 表单发送交易的所有元素,并发送基于五个不同字段生成的哈希值。 在 PHP 中
这个问题已经有答案了: Java - how to convert letters in a string to a number? (9 个回答) 已关闭 7 年前。 我需要一种简短的方法将字符串转
我是一名优秀的程序员,十分优秀!