计算街道的哈希值

Posted

技术标签:

【中文标题】计算街道的哈希值【英文标题】:Computing a hash for a street 【发布时间】:2015-04-26 23:00:10 【问题描述】:

我遇到了一点地理定位问题。我有Street name, lat, long,我希望构造一个散列,为[lat, long] 半径约500-1000m 范围内的特定街道名称返回相同的值。我不太关心哈希的长度。

附加信息:此[lat, long] 将通过移动设备 (GPS) 获得。

编辑:我考虑过从latlong 的末尾截断数字,但这并不能解决像[7.499999, 7.599999] 这样的情况

编辑 2:四舍五入到最接近的百分之一似乎更好,但也会出现一些边缘情况。

你会怎么做?

【问题讨论】:

您所描述的无法完成。具有相同的哈希码是等价关系。但是在某个地方的 500-1000m 范围内是不传递的。 @DavidWallace 任何可能不一定 100% 正确的近似值?如果您知道任何可能的改进,请查看我的编辑。 【参考方案1】:

也许您应该以另一种方式处理问题。我假设您需要一个哈希值,以便更接近指定的经纬度的街道位于顶部。

如果,那么将街道名称、long、lat 放入可比较的对象中

public class Location

    String street;
    long longitude;
    long latitude;

然后为这个对象创建一个比较器

public class LocationComparator implements Comparator

    long someLongitude;
    long someLatitude;

    public LocationComparator(long someLongitude, long someLatitude)
    
        this.someLongtitude = someLongitude;    
        this.someLatitude = someLatitude;

    

    public int compare(Location obj1, Location obj2)
    
        // get distance from obj1 to someLongtitude, someLatitude
        // get distance from obj2 to someLongtitude, someLatitude

        // return -1, 0, 1 accodring to distance for obj1, obj2
    

然后用

对列表进行排序
LocationComparator comparator = new LocationComparator(someLongitude, your someLatitude);
Collections.sort(LocationsList, comparator);

【讨论】:

实际上,这不是用例。我希望能够仅通过名称和坐标来唯一标识一条街道。我知道可以有许多“芝麻街”,但我认为半径约 1 公里内应该只有一条。 啊,好的,nvm,虽然我原以为列表顶部的那条是离你所在位置最近的街道。 但这意味着我从数据存储中检索“街道”,这正是我想要避免的。我不想担心街道是否已经存在于数据存储中,即使存在,我也不想费心检索它。我只是想盲目地存储一个哈希值,然后可以用来检索其他地标。 您可能感兴趣也可能不感兴趣,因为历史原因,我居住的城市包含两条完全独立的街道,都称为维多利亚街,彼此相距不到 1 公里。 【参考方案2】:

我会按照您描述的方式截断 latlong,然后使用

Objects.hash(name, truncatedLat, truncatedLong)

使用latlong 的截断值与仅考虑某些关键位置相同

X    X    X    X

X    X    X    X

X    X    X    X

给定一个三元组(name, lat, long),截断latlong 不能保证得到相同的哈希值,因为这条街道可能靠近多个十字路口X。但是我不认为这是一个问题,因为它只是意味着要在HashMap 中找到一条街道,您可能需要搜索几个最近的十字路口X

【讨论】:

@SayoOladeji 我已经阅读了编辑。这个答案有什么问题?大卫华莱士的评论是正确的。根本无法保证每次都获得相同的哈希值。不过,像我描述的那样会起作用。 我以为您可能没有看到 EDIT 2。这个答案本身没有问题。 我已阅读编辑 2。我不明白你的意思。无论您使用什么比例,总会有边缘情况,因为您试图用离散值替换连续空间中的一个点。我只想确保十字架相隔约 500m,然后接受您可能必须搜索搜索,例如,在找到条目之前,可能需要搜索 25 个或更多十字架。 我同意你的观点,总会有边缘情况。我只是想知道是否有可能做出改进(即使它只是将结果提高了 1%)。您的回答和解释很好,非常感谢您抽出宝贵时间提供。 嗯,您的问题在于将您的区域划分为多个补丁,其中每个补丁中的所有位置都具有相同的哈希码。使用截断的值会给你小的矩形补丁。目前尚不清楚您认为哪种方案是对此的“改进”。

以上是关于计算街道的哈希值的主要内容,如果未能解决你的问题,请参考以下文章

C#上位机开发(十五)—— 计算字符串哈希值和文件哈希值

symstore 如何计算目录哈希值

文件的哈希值事啥意思

哈希表

7.哈希

图像相似度计算之哈希值方法OpenCV实现