我有一个2 GB哈希的存储空间,我想用公共Api检查。
我想说我想创建一个API来检查我的产品是否知道某个人。 为了尊重个人隐私,我不想上传他的姓名,会员ID等。 所以我决定仅上传组合的Informationen的哈希来识别他。 现在我有2 GB(6 * 10 ^ 7)的SHA256哈希值,想要以疯狂快速检查它们。
此API应托管在azure中。
在阅读azure存储帐户的文档后,我认为Azure表存储是正确的存储解决方案。 我会将 base64哈希设置为分区键,并将行键保留为空。
检查分区键是否存在的最快方法是什么? 我认为我天真的第一次尝试并不是最好的方式。
if(members.Where(x => x.PartitionKey == Convert.ToBase64String(data.Hash))。AsEnumerable()。Any()) { return req.CreateResponse(HttpStatusCode.OK," Found Hash"); }其他 { return req.CreateResponse(HttpStatusCode.NotFound," Don找不到Hash"); }
如何上传2 GB的哈希值? 我想上传一个大文件并在每个256位后使用azure函数进行拆分并将值添加到azure存储中。或者更好的想法?
答案 0 :(得分:3)
我对此的看法:
如果您需要的唯一查询是"请检查现有哈希是否存在" (并在需要时检索其详细信息),然后表存储是完美匹配。密钥查找快速而便宜,2 GB不算什么。
Hash提供了最多样化,所以我会将它用于分区键。行键可以是任何东西。如果Upload Id
从未用于(范围)查找,请不要将其用作密钥。
使用正确的分区键,查找时间应保持不变。
如果您的意思是需要检查用户哈希是否存在,只需按分区键+行键检索一行。这是最快的操作。请参阅"检索单个实体" here
表存储支持批量插入。同样,2GB并不多,您可能花了更多时间来提问这个问题,而不是您的上传需要:)
答案 1 :(得分:0)
我看到这是用Azure-Functions标记的,所以我将添加Azure-Functions让你直接绑定到表存储。见https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-table
您甚至可以直接绑定到特定实体。 function.json看起来像:
{
"name": "<Name of input parameter in function signature>",
"type": "table",
"direction": "in",
"tableName": "<Name of Storage table>",
"partitionKey": "<PartitionKey of table entity to read - see below>",
"rowKey": "<RowKey of table entity to read - see below>",
}