Javascript 正在尝试将JS脚本移植到Swift,但有些东西没有';t计算权
该脚本将为IRC上的刻痕着色 下面是JavaScript:Javascript 正在尝试将JS脚本移植到Swift,但有些东西没有';t计算权,javascript,ios,swift,Javascript,Ios,Swift,该脚本将为IRC上的刻痕着色 下面是JavaScript: <script type="text/javascript"> function clean_nick(nick) { nick = nick.toLowerCase(); nick = nick.replace(/[^a-z]/g, "") return nick; } function hash(nick) { var clean
<script type="text/javascript">
function clean_nick(nick) {
nick = nick.toLowerCase();
nick = nick.replace(/[^a-z]/g, "")
return nick;
}
function hash(nick) {
var cleaned = clean_nick(nick);
var h = 0;
for(var i = 0; i < cleaned.length; i++) {
var a = cleaned.charCodeAt(i)
var b = (h << 6)
var c = (h << 16)
var d = h
h = a + b + c - d;
}
console.log(h);
return h;
}
function get_color(nick) {
var nickhash = hash(nick);
var deg = nickhash % 360;
var h = deg < 0 ? 360 + deg : deg;
var l = 50;
if(h >= 30 && h <= 210) {
l = 30;
}
var s = 20 + Math.abs(nickhash) % 80;
return "hsl(" + h + "," + s + "%," + l + "%)";
}
console.log(get_color("kIrb-839432-`~#$%^&*()_+{}|:<>?/,'.;[]=-_-"));
</script>
功能清洁切口(切口){
nick=nick.toLowerCase();
尼克=尼克。替换(/[^a-z]/g,”)
返回尼克;
}
函数散列(nick){
var cleaned=清洁切口(切口);
var h=0;
对于(变量i=0;i<0.length;i++){
var a=清洁的charCodeAt(i)
变量b=(h UInt32{
让characterString=字符串(自身)
设标量=characterString.Descalars
返回标量[scalars.startIndex].value
}
}
func cleanNick(nick:String)->String{
设lowercaseinck=nick.lowercased()
让noNumberNick=lowerCaseNick.components(分隔为:CharacterSet.decimalDigits).joined()
让nopuncationnick=noNumberNick.components(分隔符:CharacterSet.标点符号).joined()
让noSymbolNick=nopuncationnick.components(separatedBy:CharacterSet.symbols).joined()
let finishedNick=noSymbolNick.replacingOccurrences(of:,with:)
返回结束点
}
func散列(nick:String)->Int{
let cleanned=cleanneck(尼克:尼克)
var h=0
用于清洁的煤焦{
设a=char.unicodeScalarCodePoint()
让b=(h=30&&h位运算符在javascript中的行为就像它们应用于32位有符号整数(),而普通运算符的行为就像它们应用于64位浮点。因此,javascript中的位运算符的行为就像它们应用于32位有符号整数()但是正常算子的作用就好像它们被应用到64位浮点上,因此<>代码> 所有需要考虑的事情都写在华中科技大学的评论中。
这是我的hash
函数版本。它产生的结果与我用Safari测试JavaScript代码的结果相同:
func hash(_ nick: String) -> Int64 {
let cleaned = cleanNick(nick)
var h: Int64 = 0
for a in cleaned.utf16 {
let b = Int32(truncatingIfNeeded: h) &<< 6
let c = Int32(truncatingIfNeeded: h) &<< 16
let d = h
h = Int64(a) + Int64(b) + Int64(c) - d
}
print(h) //-> -1501579218 (JS:-1501579218)
return h
}
所有你需要考虑的事情都写在D·V.P.S.ZZOR的评论中。
这是我的hash
函数版本。它产生的结果与我用Safari测试JavaScript代码的结果相同:
func hash(_ nick: String) -> Int64 {
let cleaned = cleanNick(nick)
var h: Int64 = 0
for a in cleaned.utf16 {
let b = Int32(truncatingIfNeeded: h) &<< 6
let c = Int32(truncatingIfNeeded: h) &<< 16
let d = h
h = Int64(a) + Int64(b) + Int64(c) - d
}
print(h) //-> -1501579218 (JS:-1501579218)
return h
}
不要发布链接。你的问题需要将相关代码作为文本包含在你的问题中。清楚地解释你在翻译中遇到的问题。经过编辑,问题只是哈希计算不一样,即使数学是相同的。预期的输出是什么?不熟悉Swift,但我认为charCodeAt()的输出
和characterString.unicodeScalars[i]。值不相同。charCodeAt()
返回UTF-16输出,而Unicodescalar
是UTF-32。我还没有详细阅读您的代码,但另一个可能的问题是位和溢出的数量。由于JS和Swift之间的默认位数量可能因您测试的设备而异,并且处理溢出的方式也不同,因此您应该uld还将查看两段代码中的中间结果,看看它们的不同之处。不要发布链接。你的问题将相关代码作为文本包含在你的问题中。清楚地解释你在翻译中遇到的问题。经过编辑,问题只是哈希计算不一样,即使数学是相同的。问题是什么预期输出?不熟悉Swift,但我认为charCodeAt()
和characterString.unicodeScalars[I].value的输出不一样。charCodeAt()
返回UTF-16输出,而Unicodescalar
是UTF-32。我还没有详细阅读您的代码,但另一个可能的问题是位和溢出的数量。由于JS和Swift之间的默认位数量可能因您测试的设备而异,并且处理溢出的方式也不同,因此您应该uld还可以查看两段代码中的中间结果,并查看它们的不同之处。您是否检查了调用散列(nick:“zzzz”)
时会发生什么情况?JavaScript代码返回-2536702720
表示散列(“zzzzzz”)
。记住javascript中的加减运算符的行为就像它们应用于64位浮点一样。更改代码以补偿双重行为是否检查了调用散列(尼克:“zzzz”)
?javascript代码为散列(“zzzz”)返回-2536702720
。记住javascript中的加法/减法运算符的行为就像它们应用于64位浮点。更改代码以补偿双重行为非常酷。工作完全符合预期。还有,是的,我的Cleanneck一团糟,我还是iOS开发人员。非常感谢:)啊,非常酷。工作完全符合预期。而且是的,我的cleanNick一团糟,我还是iOS开发新手。非常感谢:)
func cleanNick(nick: String) -> String {
let lowercased = nick.lowercased().unicodeScalars
return String(
lowercased.filter( CharacterSet(charactersIn: "a" ... "z").contains )
)
}
var l = 50 // Declares variable l and assigns it to 50
if (h >= 30 && h <= 210) {
l = 30
}
let l: Int // Declares constant l
if (h >= 30 && h <= 210) {
l = 30
} else {
l = 50
}
func hash(_ nick: String) -> Int64 {
let cleaned = cleanNick(nick)
var h: Int64 = 0
for a in cleaned.utf16 {
let b = Int32(truncatingIfNeeded: h) &<< 6
let c = Int32(truncatingIfNeeded: h) &<< 16
let d = h
h = Int64(a) + Int64(b) + Int64(c) - d
}
print(h) //-> -1501579218 (JS:-1501579218)
return h
}
func cleanNick(_ nick: String) -> String {
var result = nick.lowercased()
result = String(result.unicodeScalars.filter{"a" <= $0 && $0 <= "z"})
return result
}