从字符串值创建唯一的短 ID
Creating a unique short ID from string value
我有一些数据具有以字符串形式存储的唯一 ID:
ddd.dddddaddd.dddddz
其中 d
是一些数字,a
/z
是一些字母字符。对于 a
,数字可以是 0-9,字符可以是 E
或 W
,对于 z
,字符可以是 N
或 S
。
我想把它变成一个唯一的整数以及我使用 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).
我有一些数据具有以字符串形式存储的唯一 ID:
ddd.dddddaddd.dddddz
其中 d
是一些数字,a
/z
是一些字母字符。对于 a
,数字可以是 0-9,字符可以是 E
或 W
,对于 z
,字符可以是 N
或 S
。
我想把它变成一个唯一的整数以及我使用 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).