我需要设计一种为应用程序中存储的每个文档提供哈希的方法。
使用现有的哈希库(BCrypt
等)甚至BSON ObjectId
都会生成漂亮的“哈希”或“密钥”,但它很长。
我也明白,实现短哈希的唯一方法是散列更少的字符串(如果没有弄错)。就像哈希Long
id盯着0, 1, 2, 3
一样。
然而,很容易想到,它很难在Google App Engine(GAE)数据存储中实现,或者直到现在我还没有真正克服这个需求。
跨越服务器甚至跨数据中心和自动增量ID的GAE数据存储区实体并不是真的。
实现这一目标的策略是什么?
答案 0 :(得分:2)
据我了解,您正在寻找一种为您的文档生成简短,唯一,字母数字标识符的方法。 URL缩短程序的功能(请参阅问题Making a short URL similar to TinyURL.com或What's the best way to create a short hash, similiar to what tiny Url does?或How to make unique short URL with Python?等)。我的回答是基于这个假设。
数据存储区生成唯一的自动递增ID,因此您可以依赖它。多个数据中心不是问题,您的ID将是唯一的,短的(至少,最初)并且没有冲突。这可能是微小的和类似的服务如何实现它。
在使用DatastoreService.allocateIds()将新文档保留在数据存储区中之前,您甚至可以请求一个或多个唯一ID,例如:
KeyRange keyRange = dataService.allocateIds("MyDocumentModel", 1);
long uniqueId = keyRange.getStart().getId();
然后你可以“哈希”这个ID,或者你可以通过简单地将整数ID转码为Base64(或Base36或你定义自己的字符的其他基础,例如,省略元音可以帮助你避免)来获得更短的字母数字ID不小心产生明显的咒骂词。)
如果可预测性存在问题,您可以使用一些随机字符为此字母数字ID添加前缀/后缀。