从字符串值创建唯一的短 ID

Creating a unique short ID from string value

我有一些数据具有以字符串形式存储的唯一 ID:

ddd.dddddaddd.dddddz

其中 d 是一些数字,a/z 是一些字母字符。对于 a,数字可以是 0-9,字符可以是 EW,对于 z,字符可以是 NS

我想把它变成一个唯一的整数以及我使用 hashlib 模块尝试过的东西 returns:

>>> int(hashlib.sha256(str.encode(s)).hexdigest(), 16)
Output: a very long integer (on another system cannot copy it)

有没有办法从字符串中生成一个不超过 12 位的唯一整数 ID?我知道我永远不需要超过 12 位的唯一整数 ID。

只是一些简单的事情:

>>> s = '123.45678W123.45678S'
>>> int(s.translate(str.maketrans('EWNS', '1234', '.')))
123456782123456784

不是您在问题中仍然要求的不可能的 12 位数字,而是您在评论中允许的 20 位数字。

由于你处理的是坐标,我会尽量保留最后12位ID的信息。

  • 如果你的点是全局的,可能有必要保持度数,但它们可能是普遍的,所以你可以在精度方面牺牲一些信息。
  • 如果您的点是局部的(都在小于 10 度的范围内),您可以跳过度数的前两位数并关注小数点。
  • 可能两点距离很近,所以保留一位数字作为序号可能比较谨慎。

广泛点提案:

s = "123.45678N123.45678E"
ident = "".join([s[0:6],s[10:16]]).replace(".","")
q = 0
if s[9]=="N":
    q+=1
if s[-1]=="E":
    q+=2
ident+=str(q)+'0'

该示例将转换为 123451234530

计算每个 ID 的初始 ident 数字后,如果 ident 已被占用,您应该遍历它们并递增最后一个数字。

通过这种方式,您只需将前 10 位数字分隔为 ddd.dd 格式的两度,并使用 [-2] 数字作为象限的指示符(0 :SW, 1:SE, 2:NW, 3:NE).