- 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/
GhostScript PDF/A 生成好像有错误 当您通过 GhostScript 生成 PDF/A 文档时,当您单击 Adobe Reader 时,会出现一个一致性选项卡,其中显示: “一致性
我有一个需要测试的 XPath 引擎实现。 是否有一组标准的一致性测试可以用来验证是否符合 XPath 规范(与 XSLT 相关)。 什么将是完美的 XML 文档 XPath 表达式和预期的结果。 最
帮助我了解在这种情况下我可以期望与 MongoDB 的一致性级别。 我们正在运行一个副本集,其中 Mongoid 中的 consistency 标志设置为 strong,这意味着只读到 master。
假设我有一个采用一个参数的方法。 此参数应满足以下要求: 'of type':方法需要知道参数属于特定类(或子类)。 'implements interface':方法需要知道参数实现了特定的接口(i
当协议(protocol)将属性声明为可选而具体类型将其声明为非可选时,如何使具体类型符合协议(protocol)? 这是问题所在: protocol Track { var trackNum
我正在考虑使用浏览器的 navigator.mimeTypes 数组作为第三级用户/浏览器标识符。例如,当我在 Chrome 上运行时... console.log(navigator.mimeTyp
我有以下协议(protocol): protocol ProtoAInput { func funcA() } protocol ProtoA { var input: ProtoAI
如果选择“最终”一致性,则发生写入的区域内的一致性是什么? 如果我只需要区域强一致性,应该选择哪个选项? 最佳答案 如果您需要在主要区域内进行强读取,则应该选择强一致性或有界过时一致性。 关于azur
您好,我是一名初学者,目前正在尝试学习 java 编程。课本上的问题: 编写一个程序来帮助人们决定是否购买混合动力汽车。你的程序的输入应该是:•新车的成本•预计每年行驶里程•预计汽油价格 •每加仑英里
我正在尝试制作一个可以在 UILabel 上使用的 Swift 协议(protocol), UITextField , 和 UITextView包含他们的text , attributedText ,
我有一个类扩展: extension UICollectionViewCell { class func registerFromNibInCollectionView(collectionV
为了在 Swift 中模拟对象进行测试,我通常遵循这样的模式:编写一个协议(protocol)来描述我想要的对象的行为,然后使用 Cuckoo 为其生成模拟以进行测试。 通常,这些协议(protoco
假设我有两个非通用协议(protocol)(1) protocol StringValue { var asString: String {get} } protocol StringProv
我有一组协议(protocol)可以在 UITableView 中显示一个元素: protocol TableRepresentableRow { var title: String { get
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
用“class”标记 CacheManager 解决了我的问题。 案例:一个简单的缓存器,mutating get 不是我想要的,那么对于引用类型或类类型应该怎么做? protocol Cacher
我想要一个符合协议(protocol)的变量,但是 swift 编译器告诉我协议(protocol)没有确认。 protocol A {} protocol B { var a : A { g
如果我有一个类 Christmas 和一个协议(protocol) Merry,要使 Christmas 符合 Merry,很多人会这样做: class Christmas { ... } e
@objc public protocol P1 { func p1foo() } @objc public protocol P2 { func p2foo() } class A: NSO
我有一些结构符合的基本协议(protocol)(模型)。它们也符合 Hashable protocol Model {} struct Contact: Model, Hashable { v
我是一名优秀的程序员,十分优秀!