python生成唯一字符串_如何在Python中连接多个32位哈希字符串并将其转换为唯一标识符...

我有一个问题,我正在从API中提取数据集以进行报告,但不幸的是,它具有:

没有唯一的标识符字段

组成唯一组合键的四个字段中的三个都是32位哈希值。

它们不应该是哈希值,但是由于某些原因,开发人员似乎已在此特定的API端点中对其进行了哈希处理。

我正在使用Python 3.7.6和pandas 1.0.3。数据最终将最终存储在SQL Server中。

对于我的任务,要求我确保在调用REST API时可以检查记录的唯一性,并且如果数据库中的现有记录已有更新,请使用唯一的标识符来了解要更新的行。

32位哈希值导致出现以下问题:

当串联形成有效组合键的3个哈希字段(和一个datetime字段)时,结果字符串太长而无法用作数据库主键。

该长度似乎正在重载Pandas .duplicates()函数(例如,请参见下文)

我不知道一种将它们“散列”为唯一标识符(例如整数)的方法,我可以将其用于检查数据库中可能需要更新的现有记录。如何将这个long值转换为有效的唯一标识符,该标识符对于任何完全相同的字符串哈希值都相同?

Pandas包含了pd.Factorize,它在理论上可以用于在新提取的数据中创建唯一的标识符,但是它与数据库中已经存在的先前提取的数据不一致,因为它将为相同的哈希生成不同的密钥。此外,类似于#2的分解,在给定字符串长度的情况下,也无法正确工作(请参见下文)。

我真的很感谢上述任何建议。

请找到上面#2的示例,其中pandas .duplicates()失败。我将熊猫中的四个复合键哈希字符串连接如下:

df ['id'] =(df ['问题ID']。astype(str)+ df ['WorkflowInstance ID']。astype('str')+ df ['Agent ID']。astype('str') + df ['评估开始日期'] .astype('str'))。sort_values()

然后执行:

df ['id']。duplicated()。sum()

我得到19个副本:

出[252]:19

这些是“重复项”(请注意:我已从输出中删除了数据框行号):

出[264]:

100094146736011ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00

101580231257511ea533b-5eb8-8bb1-a514-0242ac11000211e9e0ef-5ec7-3570-9724-0242ac1100052020-02-20 04:15:04 + 11:00

102935022988411ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00

103643806614811ea5122-ee46-6471-a514-0242ac11000211e9e0ef-62d2-f9b0-9724-0242ac1100052020-02-17 12:15:05 + 11:00

104448956250611ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00

104448956250611ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00

105036638204211ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00

105439525877511ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00

105439525877511ea3cba-ec08-1e01-b4fb-0242ac11000511e9e0ef-6156-6bd0-9724-0242ac1100052020-01-22 13:00:11 + 11:00

105753070464411ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00

105753070464411ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00

105929086494811ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac1100052020-01-03 11:00:05 + 11:00

105942530227011ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00

106416598476711ea533b-5eb8-8bb1-a514-0242ac11000211e9e0ef-5ec7-3570-9724-0242ac1100052020-02-20 04:15:04 + 11:00

107187437764311ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00

108645054061411ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00

108669477403111ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00

108669477403111ea3cba-ec08-1e01-b4fb-0242ac11000511e9e0ef-6156-6bd0-9724-0242ac1100052020-01-22 13:00:11 + 11:00

108783533783711ea6ebc-2980-1bb1-be7d-0242ac11000311e9e0ef-5a8e-e2f0-a8b3-0242ac1100032020-03-26 04:15:01 + 11:00

它们似乎不是重复的。考虑到它们是字符串,我会以为它们不会出现浮点数或舍入错误?

然而!如果我冲洗并重复,我将得到0次重复(应该是这样):

df ['id'] [df ['id']。duplicated()]。sort_values()。duplicated()。sum()

出[257]:0

是什么导致这种奇怪的行为?

这个解决方法至少可以让我确定记录中的唯一性,但是它不能解决上述其他问题。

这是我经过3-4年的大学和工作编程(尽管我还有很多东西要学习)之后的第一个堆栈溢出问题,所以请对我轻松一点。

谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值