在Oracle中,我的数据已通过将整数传递到“ STANDARD_HASH”中进行散列,如下所示。如何使用Python获得相同的哈希值?
将整数传递给STANDARD_HASH时在Oracle中产生结果:
SELECT STANDARD_HASH(123, 'SHA256') FROM DUAL;
# A0740C0829EC3314E5318E1F060266479AA31F8BBBC1868DA42B9E608F52A09F
Run Code Online (Sandbox Code Playgroud)
传入字符串时在Python中产生的结果:
import hashlib
hashlib.sha256(str.encode(str(123))).hexdigest().upper()
# A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3
# I want to modify this function to get the hash value above.
Run Code Online (Sandbox Code Playgroud)
也许这些信息也会有所帮助。我无法在Oracle方面进行任何更改,但如果可以的话,我会将列转换为,CHAR并且其值将与当前的Python实现相同。下面是一个示例。
将字符串传递给STANDARD_HASH时在Oracle中产生结果:
SELECT STANDARD_HASH('123', 'SHA256') FROM DUAL;
# A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3 (matches Python result)
Run Code Online (Sandbox Code Playgroud)
我做了几次尝试,比如简单地将整数传递给Python,但这会导致错误,要求输入字符串。我也一直在寻找一种编码整数的方法,但是没有取得任何进展。
我正在调查字符编码如何影响排序.我的问题是:
如何将数据框的单个列更改为不同的字符编码?
对于上下文,我将在底部包含几个额外的步骤.
1)创建数据框:
d.enc <- data.frame( utf8 = c(" ", "_ ", " _"),
mac = c(" ", "_ ", " _"),
label = c("space", "underscore space", "space underscore") )
Run Code Online (Sandbox Code Playgroud)
2)转换为字符向量并尝试设置编码:
d.enc2$utf8 <- as.character(d.enc$utf8)
d.enc2$mac <- as.character(d.enc$mac)
d.enc2$label <- as.character(d.enc$label)
Encoding(d.enc2$utf8) <- "UTF-8"
Encoding(d.enc2$mac) <- "MACINTOSH"
Encoding(d.enc2$utf8)
# [1] "unknown" "unknown" "unknown"
Encoding(d.enc2$mac)
# [1] "unknown" "unknown" "unknown"
Run Code Online (Sandbox Code Playgroud)
3)那不是我所希望的.我原以为:
# [1] "UTF-8" "UTF-8" "UTF-8" and
# [1] "MACINTOSH" "MACINTOSH" "MACINTOSH"
Run Code Online (Sandbox Code Playgroud)
4)我支持我想要的编码吗?(在mac上运行)
temp <- iconvlist()
temp[399]
# [1] "UTF-8"
temp[338] …Run Code Online (Sandbox Code Playgroud) 我想为由左连接产生的所有列添加前缀。
left_join()当被连接的两个表之间的名称相同时,可以添加后缀。但是,即使它们的名称不同,它也没有始终添加此后缀的选项。并且它没有选项来代替添加前缀。
library(dplyr)
library(nycflights13)
flights2 <- flights %>% select(year:day, hour, origin, dest, tailnum, carrier)
airports2 <- airports
result <- flights2 %>% left_join(airports2, c("dest" = "faa")) %>% head()
Run Code Online (Sandbox Code Playgroud)
结果:
Source: local data frame [6 x 14]
year month day hour origin dest tailnum carrier name
(int) (int) (int) (dbl) (chr) (chr) (chr) (chr) (chr)
1 2013 1 1 5 EWR IAH N14228 UA George Bush Intercontinental
2 2013 1 1 5 LGA IAH N24211 UA George Bush Intercontinental
3 2013 …Run Code Online (Sandbox Code Playgroud) 假设在工作空间中已经定义了一个对象:
a <- round( rnorm(10) )
[1] 0 -1 -1 -1 -1 0 2 1 1 1
Run Code Online (Sandbox Code Playgroud)
如何以编程方式生成创建的命令a?
例如,我想a在我的工作空间中使用生成以下字符串codeToCreateA:
codeToCreateA <- "a <- c( 0, -1, -1, -1, -1, 0, 2, 1, 1, 1)"
Run Code Online (Sandbox Code Playgroud)
我对一般情况感兴趣,在这种情况下a可以是任何类别的对象,包括矢量,列表或数据框。
我有很多代码使用$运算符而不是[[.我已经阅读了许多优点,[[并希望重构所有代码.
以下方法会有任何问题吗?我怎样才能最好地在Mac上进行搜索并替换为RStudio或TextWrangler?
l <- list()
l$`__a` <- data.frame(`__ID` = stringi::stri_rand_strings(10, 1), col = stringi::stri_rand_strings(10, 1), check.names = F )
Run Code Online (Sandbox Code Playgroud)
代码现在看起来像这样:
l$`__a`$`__ID`
Run Code Online (Sandbox Code Playgroud)
我想重构它:
l[["__a"]][["__ID"]]
Run Code Online (Sandbox Code Playgroud)
为实现这一目标,以下替代品是否足够?
$` to [["
` to "]]
Run Code Online (Sandbox Code Playgroud)
我在我的代码中找到了一个区域,这个方法不起作用,现在我也找到了一个解决方法来避免这个问题:用dplyr避免反引号字符
df <- dat[["__Table"]] %>% select(`__ID` ) %>% mutate(fk_table = "__Table", val = 1)
Run Code Online (Sandbox Code Playgroud)
在进行上面的替换之前,我需要将select函数更改为this以避免错误替换反引号字符:
select_(as.name("__ID"))
Run Code Online (Sandbox Code Playgroud)
遗憾的是,__由于数据是从关系数据库(FileMaker)下载的,并且需要在保留列名的同时将数据写回数据库,因此无法避免使用in列名.
参考文献[[:
关于R中的重构的参考:
下面的代码大约需要15秒才能生成10k UUID的向量。我将需要生成1M或更多,并且我估计这将花费15 * 10 * 10/60分钟,或大约25分钟。有没有更快的方法来实现这一目标?
library(uuid)
library(dplyr)
start_time <- Sys.time()
temp <- sapply( seq_along(1:10000), UUIDgenerate )
end_time <- Sys.time()
end_time - start_time
# Time difference of 15.072 secs
Run Code Online (Sandbox Code Playgroud)
本质上,我正在寻找一种R的方法,该方法设法实现此处所述的Java性能提升:Java 7或Java 6生成随机UUID的性能
它们应符合RFC 4122,但其他要求很灵活。
我对任何在该脚本完成执行后通知我的方法感兴趣。它正在从一个数据库完全加载到另一个数据库,每次执行时都会加载一个月的数据。完成后,我需要在更新控制表以加载下个月后再次启动它。由于数据量和可用 Oracle 资源的变化,执行时间差异很大,因此简单地设置计时器会导致不必要的检查或损失潜在的加载时间。
BEGIN
PKG_PACKAGENAME.PROCEDURENAME;
END;
Run Code Online (Sandbox Code Playgroud)
这些是我的想法,但我不知道在没有重大外部依赖的情况下实际上可以实现什么。目前优先选择最简单的方法。如果可以在安全的企业环境中运行,任何类似的东西也可能没问题。我不想修改包或过程内容。