如何从整数向量生成唯一的哈希键?

问题描述 投票:1回答:2

只是为了好玩,我正在尝试实现A *搜索谜题求解器。我想将到目前为止访问的所有州都保留为哈希。状态基本上是从015的整数的向量。 (我现在不会提供更多信息以免困扰这个难题。)

(defstruct posn
  "A posn is a pair struct containing two integer for the row/col indices."
  (row 0 :type fixnum)
  (col 0 :type fixnum))

(defstruct state
  "A state contains a vector and a posn describing the position of the empty slot."
  (matrix '#(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0) :type simple-vector)
  (empty-slot (make-posn :row 3 :col 3) :type posn))

因为似乎我必须检查大约100.000s的states,我认为生成一些数字作为哈希键而不是直接使用状态会更有效,并且每次都需要使用equal进行检查。] >

我开始是

(defun gen-hash-key (state)
  "Returns a unique(?) but simple hash key for STATE which is used for tracking
if the STATE was already visited."
  (loop
     with matrix = (state-matrix state)
     for i from 1
     for e across matrix
     summing (* i e)))

但必须了解,这不会导致真正独特的哈希键。例如。向量'#(14 1 4 6 15 11 7 12 9 10 3 0 13 8 5 2))'#(15 14 1 6 9 0 4 12 10 11 7 3 13 8 5 2))都将导致940,从而导致A *搜索遗漏状态,从而破坏了我的整个想法。

在我继续以业余方式来调整计算之前,我想问问是否有人可以指出我一种有效生成真正唯一密钥的方法?我缺乏正规的CS教育,无法知道是否有生成此类密钥的标准方法。

只是为了好玩,我正在尝试实现A *搜索谜题求解器。我想将到目前为止访问的所有州都保留为哈希。状态基本上是一个从0到15的整数的矢量。(我不会...

hash common-lisp
2个回答
2
投票

可以用64位整数表示其值范围从0到15的16个整数:64位除以16表示每个数字4位,并且(expt 2 4)为16。例如:


0
投票

您不需要创建一些特殊的哈希键:该语言将为您完成!

© www.soinside.com 2019 - 2024. All rights reserved.