计算街道的哈希值
Posted
技术标签:
【中文标题】计算街道的哈希值【英文标题】:Computing a hash for a street 【发布时间】:2015-04-26 23:00:10 【问题描述】:我遇到了一点地理定位问题。我有Street name, lat, long
,我希望构造一个散列,为[lat, long]
半径约500-1000m 范围内的特定街道名称返回相同的值。我不太关心哈希的长度。
附加信息:此[lat, long]
将通过移动设备 (GPS) 获得。
编辑:我考虑过从lat
和long
的末尾截断数字,但这并不能解决像[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】:我会按照您描述的方式截断 lat
和 long
,然后使用
Objects.hash(name, truncatedLat, truncatedLong)
使用lat
和long
的截断值与仅考虑某些关键位置相同
X X X X
X X X X
X X X X
给定一个三元组(name, lat, long)
,截断lat
和long
不能保证得到相同的哈希值,因为这条街道可能靠近多个十字路口X
。但是我不认为这是一个问题,因为它只是意味着要在HashMap
中找到一条街道,您可能需要搜索几个最近的十字路口X
。
【讨论】:
@SayoOladeji 我已经阅读了编辑。这个答案有什么问题?大卫华莱士的评论是正确的。根本无法保证每次都获得相同的哈希值。不过,像我描述的那样会起作用。 我以为您可能没有看到 EDIT 2。这个答案本身没有问题。 我已阅读编辑 2。我不明白你的意思。无论您使用什么比例,总会有边缘情况,因为您试图用离散值替换连续空间中的一个点。我只想确保十字架相隔约 500m,然后接受您可能必须搜索搜索,例如,在找到条目之前,可能需要搜索 25 个或更多十字架。 我同意你的观点,总会有边缘情况。我只是想知道是否有可能做出改进(即使它只是将结果提高了 1%)。您的回答和解释很好,非常感谢您抽出宝贵时间提供。 嗯,您的问题在于将您的区域划分为多个补丁,其中每个补丁中的所有位置都具有相同的哈希码。使用截断的值会给你小的矩形补丁。目前尚不清楚您认为哪种方案是对此的“改进”。以上是关于计算街道的哈希值的主要内容,如果未能解决你的问题,请参考以下文章