- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图通过调用 node.hash 并将新节点存储在一个集合中来检测之前在我的 SpriteKit 游戏中未发生碰撞的节点之间的碰撞。我看到一段时间后,新节点与我之前调用 node.removeFromParent() 的节点具有相同的哈希值。
我猜是因为我从父级中移除并一遍又一遍地重新创建非常相似的节点,SK 会自动回收一些节点。
如何从 SpriteKit 中的节点获取真正唯一的哈希值?
如果需要进一步说明,请告诉我。我觉得发布我的代码与这篇文章不太相关。
此外,当我使用连接到 xcode 的手机进行调试时,我无法重现此问题,但我添加了日志记录,显示 node.hash 对于新创建的节点不是唯一的。有人知道为什么我的手机连接到 Xcode 后回收行为会有所不同吗?
最佳答案
我认为您可能误解了哈希的含义和作用。
散列不一定是唯一值。它是某种(不一定是加密的)单向函数,它接受任意数据并产生一个值。如果相同的数据被哈希多次,它会产生相同的哈希值,而不是不同的值。
然而,对您不利的是 .hash
值不是加密散列(这在某种程度上是计算密集型的)。哈希函数的质量(无论是否加密)取决于哈希冲突的频率。当两个不同值产生相同散列时,就会发生散列冲突。
除其他外,根据低哈希冲突率选择加密哈希函数。 .hash
函数可能有很高的冲突率,即使您的数据不同,这取决于您的特定数据。
一个更好的解决方案是向您的节点添加一个可以轻松检查的属性:
class MyNodeClass: SkShapeNode {
var hasCollided = false // Publicly accessible property
}
我注意到您在其他评论中说,“我对找到合适的散列很感兴趣。”我强烈建议不要使用这种方法,因为散列函数肯定会带来计算负载。功能越好,负载就越高。
如果您真正要寻找的是每个节点的唯一标识符(而不是碰撞跟踪器),那么为什么不实现一个内部属性,该属性是根据一个类值从初始化器初始化的,该类值只产生一个唯一的、递增的 ID ?
关于ios - SpriteKit : Hashing a Recycled SKShapeNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36968344/
我是一名优秀的程序员,十分优秀!