注册 登录
编程论坛 VFP论坛

吹版,在VFP中怎么使用API函数UuidCreateSequential

easyppt 发布于 2023-04-12 13:34, 2073 次点击
UuidCreateSequential in rpcrt4.dll

如何在VFP中使用这个API
26 回复
#2
foxfans2023-04-12 15:56
DECLARE long UuidCreateSequential in "rpcrt4.dll" string @
DECLARE long StringFromGUID2 in "ole32.dll" string,string @,long
STORE "" TO mGuid,cGuid
STORE 0 TO nRet
mGuid=REPLICATE(CHR(0),16)
cGuid=REPLICATE(CHR(0),100)
IF 0=UuidCreateSequential(@mGuid)
   nRet=StringFromGUID2(mGuid,@cGuid,LEN(cGuid)/2)
   ?STRCONV(LEFT(cGuid,nRet*2),6)
ENDIF
#3
easyppt2023-04-12 16:22
谢谢!

第一行 是 API函数生成的。
第二行 是 sqlserver 中 生成的,
对比了一下,API的结果中  前面 3段 内容反了:
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-4-12 16:50编辑过]

#4
easyppt2023-04-12 16:48
https://learn.
microsoft帮助中关于 UuidCreateSequential的说明文档里面 有个 参阅:UuidToString 这个 函数输出可以吗,结果会不会也会反的啊?
只有本站会员才能查看附件,请 登录
#5
foxfans2023-04-12 17:57
那就不是标准的guid,可以用下面试试
DECLARE long UuidCreateSequential in "rpcrt4.dll" string @ 
STORE "" TO mGuid  
mGuid=REPLICATE(CHR(0),16)
IF 0=UuidCreateSequential(@mGuid)
   ?STRCONV(mGuid,15)
ENDIF
#6
吹水佬2023-04-12 18:39
回复 3楼 easyppt
大小端问题
数据结构:
typedef GUID UUID;

typedef struct _GUID {
  unsigned long  Data1;
  unsigned short Data2;
  unsigned short Data3;
  unsigned char  Data4[8];
} GUID;

#7
iswith2023-04-12 18:52
UuidCreateSequential函数存在隐私的问题,不适合集群环境,并且需要重新排序后再提交到数据库,UuidCreateSequential函数生成的GUID规则与SQL Server中排序的规则存在不一致,这样仍然会导致严重的IO问题,所以需要将GUID重新排序,上面有大佬给的结构,在声明变量时它一个pstr*,不是一个单纯的string。
#8
easyppt2023-04-13 08:23
谢谢各位的回复!

关于隐私,源于 UUID 基于网卡MAC生成机制吗,不知道生成的UUID能不能还原出MAC ?

#9
iswith2023-04-13 08:27
原理应该是可以还原,实际我没有这么无聊。。。好像是后8位还是在哪儿位置你百度了解一下。。。。
#10
easyppt2023-04-13 08:29
另外 发现一个问题:VFP 的order by  和 SQL SERVER 的 orde by  排序规则不一样

有办法让 VFP的 order by 和 SQL SERVER 一样吗 ?

Set Collate To 试了几个 好像都不行
#11
sostemp2023-04-13 08:45
后8节 应该是MAC

[此贴子已经被作者于2023-4-13 08:48编辑过]

#12
easyppt2023-04-13 09:03
百度了一下  :), python 根据uuid 获取mac地址,懂 python 的 调试一下 看看,能不能根据我上面截图里的UUID还原一下MAC,看看是不是我电脑的的MAC

https://

如果能再改写成VFP版的 那就更好了!

#13
倦猫19732023-04-13 13:21
翻车了,这都能有第二页。。。。

这都至少12小时这去了~~~~喜提一天摸鱼工资。

[此贴子已经被作者于2023-4-13 13:26编辑过]

#14
吹水佬2023-04-13 14:17
以下是引用easyppt在2023-4-13 09:03:03的发言:

百度了一下  :), python 根据uuid 获取mac地址,懂 python 的 调试一下 看看,能不能根据我上面截图里的UUID还原一下MAC,看看是不是我电脑的的MAC

https://

如果能再改写成VFP版的 那就更好了!

DECLARE long UuidCreateSequential IN rpcrt4 string@
uuid = REPLICATE(0h00,16)
IF UuidCreateSequential(@uuid) == 0
    ? TRANSFORM(RIGHT(STRCONV(uuid,15),12),"@R ##-##-##-##-##-##")
ENDIF

用UuidCreateSequential来获取MAC并不可靠,甚至有可能得到的不是真正的MAC。
在我这有2个以太网适配器,一个以太网、一个蓝牙,UuidCreateSequential得到的是蓝牙。

获取MAC,简单的可以 ipconfig /all

#15
easyppt2023-04-13 15:16
哈哈,测试了一下吹版代码
原来 uuid最后一段竟然是 没有任何加工的MAC地址 ...,直接明码啊

好像是的,我笔记本上网用的是无线网卡,但显示的是以太网网卡(有线)

[此贴子已经被作者于2023-4-13 15:20编辑过]

#16
吹水佬2023-04-13 16:00
以下是引用easyppt在2023-4-13 15:16:39的发言:

哈哈,测试了一下吹版代码
原来 uuid最后一段竟然是 没有任何加工的MAC地址 ...,直接明码啊

好像是的,我笔记本上网用的是无线网卡,但显示的是以太网网卡(有线)

UuidCreateSequential好像只是针对以太网
#17
iswith2023-04-13 21:50
专门为了这个写了个函数啊。。。
只有本站会员才能查看附件,请 登录
#18
倦猫19732023-04-13 22:19
以下是引用iswith在2023-4-13 21:50:52的发言:

专门为了这个写了个函数啊。。。


 我拷,真有这么闲的。
#19
easyppt2023-04-14 08:43
总结一下:
1、sostemp 说的对,后8位就是MAC,只是这个MAC 可能不是当前联网的MAC,所以没细看,在此表示感谢。
2、吹水佬 、foxfans、iswith 都是技术大牛,还特别热于助人和无私奉献,侠之大者!
3、foxfans先生在5楼给出的答案是吻合的,配合吹版示例中的 transform()函数格式化一下,就可以得到和SQLSERVER一致的效果了。
4、UuidCreateSequential生成有序Guid 还是很有价值的,只是因为后8为直接取MAC地址有不少争议,网上搜了一下,有很多改进版本。
5、本帖的初衷是需要生成有序Guid,经过分析,还是由服务器统一生成 UUID 才能提现【有序】的价值,这点 iswith 说的很清楚。
6、所以最终我还是放弃了由客户端 利用UuidCreateSequential创建UUID,而是统一由服务器端生成,在数据迁移与合并的时候,影响也能降到最低。

另外:
1)、在阿里云的几台服务器上测试了一下,得到的MAC,用 ipconfig/all 比对,都不吻合。
2)、在我这里,我觉得后8位是否是真实联网MAC不是很重要,另外暴露也无妨,相反我还可以利用MAC验证数据迁移的变化。
3)、业务模块开发,我基本统一使用 自增型ID,但是针对数据迁移需求的,自增型确实不太合适,为了降低重复的概率,还是用UUID吧,尽管它也是相对的,不纠结了。

理解和感悟 也需要一个过程,也是学习的过程。
再次表示感谢!

[此贴子已经被作者于2023-4-14 09:08编辑过]

#20
吹水佬2023-04-14 08:51
以下是引用easyppt在2023-4-14 08:43:55的发言:

总结一下:
1、sostemp 说的对,后8位就是MAC,只是这个MAC 可能不是当前联网的MAC,所以没细看,在此表示感谢。
2、吹水佬 、foxfans、iswith 都是技术大牛,还特别热于助人和无私奉献,侠之大者!
3、foxfans先生在5楼给出的答案是吻合的,配合吹版示例中的 transfrom()函数格式化一下,就可以得到和SQLSERVER一致的效果了。
4、UuidCreateSequential生成有序Guid 还是还有价值的,只是因为后8为直接取MAC地址有不少争议,网上搜了一下,有很多改进版本。
5、本帖的初衷是需要生成有序Guid,经过分析,还是由服务器统一生成 UUID 才能提现【有序】的价值,这点 iswith 说的很清楚。
6、所以最终我还是放弃了由客户端 利用UuidCreateSequential创建UUID,而是统一由服务器端生成,在数据迁移与合并的时候,影响也能降到最低。

理解和感悟 也需要一个过程,也是学习的过程。
再次表示感谢!

可以测试一下:
1、UuidCreateSequential不能正常检测到以太网适配器的情况得到的MAC是什么
2、没有以太网适配器的情况得到的MAC是什么
#21
sostemp2023-04-14 09:07
以下是引用吹水佬在2023-4-14 08:51:05的发言:


可以测试一下:
1、UuidCreateSequential不能正常检测到以太网适配器的情况得到的MAC是什么
2、没有以太网适配器的情况得到的MAC是什么


枚举一下网卡信息就可以了,UUID一般是第一个网卡的MAC
#22
吹水佬2023-04-14 09:17
以下是引用sostemp在2023-4-14 09:07:48的发言:

枚举一下网卡信息就可以了,UUID一般是第一个网卡的MAC

问题是他不能正常检测到以太网适配器或没有以太网适配器时也会给你一个MAC,这个MAC的意义与其他正常的MAC有什么不同。
#23
sostemp2023-04-14 09:24
以下是引用吹水佬在2023-4-14 09:17:04的发言:


问题是他不能正常检测到以太网适配器或没有以太网适配器时也会给你一个MAC,这个MAC的意义与其他正常的MAC有什么不同。


测试了一下,有网卡的情况,此时禁用了有线网卡与无线网卡,用WMI枚举后获取不到,UUID还是可以得到。
无网卡的情况,没有测试。

#24
吹水佬2023-04-14 09:33
以下是引用sostemp在2023-4-14 09:24:05的发言:



测试了一下,有网卡的情况,此时禁用了有线网卡与无线网卡,用WMI枚举后获取不到,UUID还是可以得到。
无网卡的情况,没有测试。

所以,UUID并不一定“真实”,这是这个API最受争论的一点。
#25
iswith2023-04-14 14:51
此时禁用了有线网卡与无线网卡,用WMI枚举后是获取不到,受争论的一点不在这个问题,你再了解了解它争论地方在哪里。为此我又写了一个函数来获取本机的MAC,可以区别在用与不在用的。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-4-14 14:52编辑过]

#26
吹水佬2023-04-14 15:40
争论点与多少个以太网适配器并无多大关系,列出多少个MAC也不重要。
重要的是由UuidCreateSequential得到的MAC的真实性(或可靠性),UuidCreateSequential只是给出UUID,如果访问MAC地址异常,它会随机生成6个字节。
所以,通过UuidCreateSequential给出的UUID来获取MAC可不可靠,这是有争论,据说版本不同结果也有不同。

#27
ljb88642023-10-10 15:58
cip=cmdShell("cmd /c ipconfig/all&exit")
1