我知道基于Guids的主键不具有最佳性能(由于碎片),但它们是全局唯一的并且允许复制方案.
另一方面,整体标识符以可扩展性为代价具有更高的性能.
但在某些情况下,有人想要使用顺序uniqueidentifier作为主键吗?我认为,它胜过了GUID的目的,但我仍然偶尔会看到提及的后遗症.
我在这里想念什么?
我想知道是否有办法生成有效的GUID/UUID,其中第一个(或任何部分)部分是用户选择的前缀.
即,GUID的格式为AAAAAAAA-BBBB-CCCC-DDDD-DDDDDDDDDDD,我想将任何部分设置为预定义值(理想情况下为AAA).目标是使GUID仍然是全局唯一的,但它们不需要加密安全.
我遇到了这个JavaScript函数,我不太清楚它在做什么,特别是使用0xF.
0xF究竟做了什么.对我来说,这似乎是一个空的蚕食.
function()
{
var g = "";
for(var i = 0; i < 32; i++)
g += Math.floor(Math.random() * 0xF).toString(0xF)
return g;
}
Run Code Online (Sandbox Code Playgroud) 今天,我编写了一个perl脚本,如下代码:
my @files = <./{FF35B8A6-985C-4644-87B1-3FE83D1A50B}/*>;
print @files;
Run Code Online (Sandbox Code Playgroud)
但它什么也没输出.当我用一般路径(如d:)更改guid路径时,它工作正常.为什么?perl可以支持用guid字符串命名的路径吗?
操作系统:Windows 7 32位
Perl版本:ActivePerl 5.12.3
GUID是MSFT生成的128位唯一标识符.
我怀疑GUID是否是全球唯一的.我的意思是我生成的GUID,在任何系统中使用任何应用程序的人都没有其他人可以生成?真的吗?
我很惊讶微软如何知道或追踪这种独特性.
而且生成的uniquie GUID可以链接到任何实体吗?应用,变量,系统,?
GUOD所有实体可以链接到什么?任何人都可以澄清GUID的概念吗?编程语言是独立的吗?
我试图创建一个看起来像这样的扩展方法......
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> value, IEnumerable<T> compareTo, Func<T, object> compareFieldPredicate)
{
return value.Where(o => !compareTo.Exists(p => compareFieldPredicate.Invoke(p) == compareFieldPredicate.Invoke(o)));
}
Run Code Online (Sandbox Code Playgroud)
我的想法是,我可以做这样的事......
IEnumerable<MyCollection> distinctValues = MyCollection.Distinct(MyOtherCollection, o => o.ID); //Note that o.ID is a guid
Run Code Online (Sandbox Code Playgroud)
现在,在这一点上,我本来希望只有我的不同物品归还给我,但我发现从来没有这样.
进一步研究使用以下代码分解此方法.
Guid guid1 = Guid.NewGuid();
Guid guid2 = new Guid(guid1.ToString());
Func<MyObject, object> myFunction = o => o.ID;
Func<MyObject, object> myFunction1 = o => o.ID;
bool result = myFunction(MyObject) == myFunction1(MyObject);
//result = false
Run Code Online (Sandbox Code Playgroud)
我发现即使Guids是相同的,比较也总是返回false.
这是什么原因?
当我有GUID字段时,有没有办法使用INSERT语句在SQL CE中插入行.
在C#中,我使用
ID = Guid.NewGuid()
Run Code Online (Sandbox Code Playgroud)
但在SQL控制台中,我找不到关键字来执行此操作.
我发现这一个:
> Insert into Customer (ID, Name) values ('f5c7181e-e117-4a98-bc06-733638a3a264','MyCustomer')
Run Code Online (Sandbox Code Playgroud)
如果要插入很多行怎么办?
我在这里有一个查询,在整个数据库中搜索我选择的特定GUID.现在,它正在完成它的编程操作:遍历所有列/表组合并输出可能包含或不包含信息的表.我想将此更改为仅输出包含结果的表.
这是代码:
DECLARE
@tab_list NVARCHAR(MAX),
@col_list NVARCHAR(MAX),
@IDquery NVARCHAR(MAX),
@srvName NVARCHAR(MAX),
@getList CURSOR
SET @srvName = 'Server_Name'
SET @getList = CURSOR LOCAL FAST_FORWARD FOR
SELECT [TABLE_NAME]
,[COLUMN_NAME]
FROM [Server_Name].[INFORMATION_SCHEMA].[COLUMNS]
WHERE [COLUMN_NAME] LIKE '%id'
AND [DATA_TYPE] LIKE 'uniqueidentifier'
ORDER BY [TABLE_NAME] ASC
OPEN @getList
FETCH NEXT FROM @getList INTO @tab_list, @col_list
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @tab_list + ' -- ' + @col_list
SET @IDquery =
'SELECT *' +
' FROM ' + @srvName + '.dbo.' + @tab_list +
' …Run Code Online (Sandbox Code Playgroud) 我从安全角度提出了有关使用GUID的一些建议.我开发了一个ASP.Net应用程序.它为用户提供对Web服务器上不存在的某些材料(如文档和照片)的访问权限.这些存储在文件服务器上.我有一个'GetResource.aspx'页面,它获取资源的ID,使用System.IO.FileInfo将其打开到响应流并返回它.
因此,GetResource.aspx?id = 123会返回一个用户有权访问的图片.当然,用户可以手动输入URL作为GetResource.aspx?id = 456,在这种情况下,将返回具有该ID的图片/文档等,并且它可能不是他们有权访问的人.
所以显然使用整数ID是不够的.使用GUID作为ID提供足够的"随机性",我可以可靠地假设用户永远不能手动输入"GetResource.aspx?guid = {A guessed guid}"并期望访问有效资源,包括使用脚本每秒做出许多随机猜测?
或者,没有替代从Session变量确定用户的ID,确定他确实有权访问所请求的资源,然后才返回它(在我写这个时,我越来越相信是这样的! ).
谢谢
guid ×10
c# ×3
sql ×3
asp.net ×1
c++ ×1
coding-style ×1
comparison ×1
cursor ×1
database ×1
insert ×1
javascript ×1
lambda ×1
path ×1
perl ×1
registry ×1
security ×1
sql-server ×1
t-sql ×1
windows ×1