在我们的应用程序中,我们使用具有Guid值的属性创建Xml文件.该值必须在文件升级之间保持一致.因此,即使文件中的其他内容发生更改,该属性的guid值也应保持不变.
一个显而易见的解决方案是创建一个静态字典,其中包含文件名和用于它们的Guids.然后每当我们生成文件时,我们都会在字典中查找文件名并使用相应的guid.但这不可行,因为我们可能会扩展到100个文件并且不想保留大量的guid.
所以另一种方法是根据文件的路径使Guid相同.由于我们的文件路径和应用程序目录结构是唯一的,因此Guid对于该路径应该是唯一的.因此,每次我们运行升级时,文件都会根据其路径获得相同的guid.我找到了一种很酷的方法来产生这样的' 确定性指导 '(感谢Elton Stoneman).它基本上是这样的:
private Guid GetDeterministicGuid(string input)
{
//use MD5 hash to get a 16-byte hash of the string:
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
byte[] inputBytes = Encoding.Default.GetBytes(input);
byte[] hashBytes = provider.ComputeHash(inputBytes);
//generate a guid from the hash:
Guid hashGuid = new Guid(hashBytes);
return hashGuid;
}
Run Code Online (Sandbox Code Playgroud)
所以给定一个字符串,Guid将始终是相同的.
有没有其他方法或建议的方法来做到这一点?该方法的优点或缺点是什么?
我的代码看起来像这样:
u := make([]byte, 16)
_, err := rand.Read(u)
if err != nil {
return
}
u[8] = (u[8] | 0x80) & 0xBF // what does this do?
u[6] = (u[6] | 0x40) & 0x4F // what does this do?
return hex.EncodeToString(u)
Run Code Online (Sandbox Code Playgroud)
它返回一个长度为32的字符串,但我不认为它是一个有效的UUID.如果它是一个真正的UUID,为什么它是一个UUID,什么是修改的值的代码的目的u[8]和u[6].
有没有更好的方法来生成UUID?
我想生成随机的UUID,因为对于我的程序中的实例而言,它具有唯一标识符非常重要.我查看了Boost UUID,但我无法生成UUID,因为我不明白要使用哪个类和方法.
如果有人能给我任何如何实现这一目标的例子,我将不胜感激.
这涉及到这个问题.我正在使用此答案在JavaScript中生成UUID:
'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
Run Code Online (Sandbox Code Playgroud)
这个解决方案似乎工作正常,但我遇到了冲突.这就是我所拥有的:
所以问题是:
我使用Rails 3.0.20和ruby 1.8.7(2011-06-30 patchlevel 352)
请建议我生成guid的最佳插件.
出于多种原因^,我想在我的一些Django模型中使用UUID作为主键.如果我这样做,我是否仍然可以使用"contrib.com","django-voting"或"django-tagging"之类的外部应用程序,它们通过ContentType使用通用关系?
以"django-voting"为例,投票模型如下所示:
class Vote(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('content_type', 'object_id')
vote = models.SmallIntegerField(choices=SCORES)
Run Code Online (Sandbox Code Playgroud)
这个应用程序似乎假设被投票的模型的主键是一个整数.
内置的评论应用程序似乎能够处理非整数PK,但是:
class BaseCommentAbstractModel(models.Model):
content_type = models.ForeignKey(ContentType,
verbose_name=_('content type'),
related_name="content_type_set_for_%(class)s")
object_pk = models.TextField(_('object ID'))
content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")
Run Code Online (Sandbox Code Playgroud)
对于第三方应用程序而言,这种"整数假定PK"问题是否会成为一种常见情况,这会使使用UUID变得痛苦?或者,我可能会误读这种情况吗?
有没有办法在Django中使用UUID作为主键而不会造成太多麻烦?
我们正在考虑使用UUID值作为MySQL数据库的主键.插入的数据是从数十台,数百台甚至数千台远程计算机生成的,并以每秒100-40,000次插入的速率插入,我们永远不会进行任何更新.
在我们开始剔除数据之前,数据库本身通常会达到大约50M的记录,因此不是一个庞大的数据库,但也不是很小.我们也计划在InnoDB上运行,但如果我们正在做的事情有更好的引擎,我们愿意改变它.
我们已准备好使用Java的Type 4 UUID,但在测试中已经看到了一些奇怪的行为.首先,我们将存储为varchar(36),现在我意识到我们最好使用二进制(16) - 尽管我不确定会有多好.
更大的问题是:当我们拥有50M记录时,这个随机数据对索引的影响有多大?如果我们使用例如最左边的位被加时间戳的1型UUID,我们会更好吗?或者我们应该完全抛弃UUID并考虑auto_increment主键?
我正在寻找关于不同类型的UUID在MySQL中作为索引/主键存储时的性能的一般想法/提示.谢谢!
为了简单和(假设)速度,我总是倾向于使用长整数作为数据库中的主键.但是当对象实例使用类似于REST或Rails的URL方案时,我最终会得到这样的URL:
http://example.com/user/783
Run Code Online (Sandbox Code Playgroud)
然后假设有ID为782,781,......,2和1的用户.假设有问题的Web应用程序足够安全,可以防止人们输入其他号码未经授权查看其他用户,简单的顺序分配的代理键也"泄漏"实例的总数(早于这一个),在这种情况下是用户,这可能是特权信息.(例如,我是stackoverflow中的用户#726.)
将一个UUID/GUID是一个更好的解决方案吗?然后我可以像这样设置URL:
http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66
Run Code Online (Sandbox Code Playgroud)
不完全简洁,但显示的用户隐含信息较少.当然,它隐藏着"通过默默无闻的安全",这无法取代适当的安全性,但它似乎至少更安全一点.
这种好处是否值得为Web可寻址对象实例实现UUID的成本和复杂性?我认为我仍然希望使用整数列作为数据库PK来加速连接.
还有UUID的数据库内表示问题.我知道MySQL将它们存储为36个字符的字符串.Postgres似乎有更高效的内部表示(128位?)但我自己没有尝试过.有人对此有经验吗?
更新:对于那些询问只是在URL中使用用户名的人(例如,http://example.com/user/yukondude),这适用于名称独特的对象实例,但是对于数以万计的网络来说呢?真正只能用数字识别的app对象?订单,交易,发票,重复图像名称,stackoverflow问题,......
基于问题的答案,MySQL中的UUID性能,答案的人建议将UUID存储为数字而不是字符串.我不太确定如何做到这一点.有人可以建议我吗?我的ruby代码如何处理?
我不明白蓝牙UUID是什么意思.UUID是否表示协议(例如RFCOMM)?如果是这样,为什么这些createRfcommSocketToServiceRecord()方法需要UUID,当他们在名字中指定rfcomm时?为什么BluetoothChat示例代码有一个看似随意的,硬编码的UUID?
我的问题出现了,因为,根据这个问题,当运行4.0.4的设备尝试使用反射连接(到外部的,非Android设备)时,我得到一个空指针异常.但是,该问题的解决方案对我不起作用.UUID muuid = device.getUuids()[0].getUuid();提出异常.
编辑:我已经通过根据此答案(使用UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");)硬编码串行端口服务的UUID解决了这个问题.
我更加困惑的是为什么我需要提供一个UUID来创建一个不安全的rfcomm套接字,createInsecureRfcommSocketToServiceRecord(),但不使用反射方法.
任何人都可以理顺我吗?
uuid ×10
guid ×2
mysql ×2
.net ×1
android ×1
bluetooth ×1
boost ×1
boost-uuid ×1
c# ×1
c++ ×1
collision ×1
content-type ×1
database ×1
django ×1
go ×1
innodb ×1
javascript ×1
performance ×1
primary-key ×1
random ×1
rfcomm ×1
ruby ×1
sequence ×1