我有一列(我们称之为 STR),其中的字符串值不会改变。例如但随着时间的推移会收到新的价值:
力量 |
---|
abc123 |
efg456 |
hij789 |
我想创建一个列,上面列中的每个字符串值都附有一个数值。该数值不应在每次程序运行时更改,并且长度应保持一致(例如,每个长度应为 7 位)。示例输出:
力量 | ID |
---|---|
abc123 | 0125699 |
efg456 | 6589455 |
hij789 | 0995525 |
假设额外的值被添加到 STR 列并且我不得不重新运行代码,我希望现有生成的 ID 值保持不变,但额外的 STR 值接收新生成的 ID。例如:
力量 | ID |
---|---|
abc123 | 0125699 |
efg456 | 6589455 |
hij789 | 0995525 |
klm101 | 0555989 |
nop558 | 5595959 |
我试过使用哈希函数,但每次程序运行时这似乎都会改变:
def generate_id(s): 返回 abs(哈希(s)) % (15 ** 15)
df['ID'] = df['STR'].apply(generate_id)
关于如何实现所需输出的任何建议?在多次执行程序后似乎找不到一致的解决方案。这样做的最终目标是创建一个 ID 值,该值可以识别 STR 列,而不会在许多不同的数据帧中泄露它的值。谢谢!
对于数值,您可以创建一个函数对其进行哈希处理,获取十六进制,然后使用
int(s, base=16)
获取数值。所以,代码会变成
import hashlib
def numericvalue_from_string(s):
h = hashlib.new('sha1') #for shortest results with sha, if you are ok with big numbers then sha256 or sha512 also work.
h.update(s.encode())
hx = h.hexdigest()
return int(hx, base=16)
所以如果我运行
numericvalue_from_string('m')
它将产生 611156256285597126173522716470136971498835711720
(sha1)