在php中有一种方法可以从字符串中提供唯一的哈希值,但哈希值只是由数字组成的?
例:
return md5(234); // returns 098f6bcd4621d373cade4e832627b4f6
Run Code Online (Sandbox Code Playgroud)
但是我需要
return numhash(234); // returns 00978902923102372190
(20 numbers only)
Run Code Online (Sandbox Code Playgroud)
这里的问题是我希望哈希很短.
编辑: 好的,让我来解释这里的背景故事.我有一个网站,每个注册人都有一个ID,我也需要一个ID供该人使用和交换(因此不能太长),到目前为止ID编号为00001,00002,00003等. ..
要修复第1点和第2点,我需要"隐藏"数字,同时保持其唯一性.
数字哈希函数基于/sf/answers/1657590931/的代码
/**
* Return a number only hash
* https://stackoverflow.com/a/23679870/175071
* @param $str
* @param null $len
* @return number
*/
public function numHash($str, $len=null)
{
$binhash = md5($str, true);
$numhash = unpack('N2', $binhash);
$hash = $numhash[1] . $numhash[2];
if($len && is_int($len)) {
$hash = substr($hash, 0, $len);
}
return $hash;
}
// Usage …Run Code Online (Sandbox Code Playgroud) 看到Java没有可空类型,也没有TryParse(),如何在不抛出异常的情况下处理输入验证?
通常的方式:
String userdata = /*value from gui*/
int val;
try
{
val = Integer.parseInt(userdata);
}
catch (NumberFormatException nfe)
{
// bad data - set to sentinel
val = Integer.MIN_VALUE;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用正则表达式来检查它是否可解析,但这似乎也是很多开销.
处理这种情况的最佳做法是什么?
编辑:理由:关于异常处理,有很多关于SO的讨论,一般的态度是异常应仅用于意外情况.但是,我认为糟糕的用户输入是预期的,并不罕见.是的,这确实是一个学术观点.
进一步编辑:
一些答案证明了SO究竟出了什么问题.你忽略了被问到的问题,并回答了与之无关的另一个问题.问题不是要求层之间的过渡.如果数字是不可解析的,那么问题不在于询问返回什么.如你所知,val = Integer.MIN_VALUE; 对于完全无上下文的代码片段来自应用程序的应用程序来说,它是完全正确的选项.
是否有一种比使用if语句或三元运算符更有效的方法来钳制实数?我想为双打和32位修复点实现(16.16)做到这一点.我不是要求代码可以处理这两种情况; 它们将在不同的功能中处理.
显然,我可以这样做:
double clampedA;
double a = calculate();
clampedA = a > MY_MAX ? MY_MAX : a;
clampedA = a < MY_MIN ? MY_MIN : a;
Run Code Online (Sandbox Code Playgroud)
要么
double a = calculate();
double clampedA = a;
if(clampedA > MY_MAX)
clampedA = MY_MAX;
else if(clampedA < MY_MIN)
clampedA = MY_MIN;
Run Code Online (Sandbox Code Playgroud)
fixpoint版本将使用函数/宏进行比较.
这是在代码的性能关键部分完成的,所以我正在寻找一种尽可能有效的方法(我怀疑它会涉及位操作)
编辑:它必须是标准/便携式C,平台特定的功能在这里没有任何兴趣.此外,MY_MIN和MY_MAX我想要钳制的值相同(在上面的例子中加倍).
我对F#很陌生,发现类型推断确实很酷.但目前似乎它也可能导致代码重复,这不是一件很酷的事情.我想总结一个这样的数字的数字:
let rec crossfoot n =
if n = 0 then 0
else n % 10 + crossfoot (n / 10)
crossfoot 123
Run Code Online (Sandbox Code Playgroud)
这正确打印6.但是现在我的输入数字不适合32位,所以我必须将其转换为.
let rec crossfoot n =
if n = 0L then 0L
else n % 10L + crossfoot (n / 10L)
crossfoot 123L
Run Code Online (Sandbox Code Playgroud)
然后,BigInteger我来了,猜猜是什么......
当然,我只能提供bigint版本和转换输入参数,并根据需要输出参数.但首先我假设使用BigInteger过度int有一些性能惩罚.第二个let cf = int (crossfoot (bigint 123))不好看.
写这个没有通用的方法吗?
是否有内置的JavaScript函数将字符串转换为特定的语言环境(在我的情况下是欧元)?
例如50.00应该转换为50,00 €.
在完成上一次开发的代码训练之后,我意识到我需要将所有基于钱的列移动到不使用浮点数学.在Java方面,这意味着使用BigDecimal,但在使用Hibernate/JPA和MySQL 5时,什么是适当的MySQL数据类型来制作该列?
可能重复:
PHP Round函数 - 最高可达2 dp?
我的问题是:
当我使用
ceil(3.6451895227869);
Run Code Online (Sandbox Code Playgroud)
我喜欢
4
Run Code Online (Sandbox Code Playgroud)
但我想要
3.65
Run Code Online (Sandbox Code Playgroud)
你能帮我吗?
UPDATE
Run Code Online (Sandbox Code Playgroud)
请记住:这应该像圆形时一样圆形到圆柱形
3.6333333333333
它不能是3.63但应该是3.64
在JavaScript中,数字被定义为64位双精度.对于分布式Web应用程序,我有一个特定的用途,只有在我可以依赖所有浏览器的一致结果时才能使用.
尽管使用IEEE标准的规范,我自然怀疑数学库甚至底层硬件的实现可能会有微小的差异,这可能会导致复合错误.
是否有任何兼容性数据来源或可靠的测试套件来验证浏览器中的双精度计算?特别是,我还需要考虑移动浏览器(通常基于ARM).
澄清 -
这是一个关于浏览器兼容性的问题.我试图了解是否可以依赖所有浏览器以IEEE浮点定义的可靠,一致和可重复的方式处理数字.在大多数语言中,这是一个安全的假设,但有趣的是,在浏览器中存在一点不确定性.
关于如何避免由于缺乏精度和舍入误差导致的浮点问题,有一些很好的建议.在大多数情况下,如果您需要准确性,您应该遵循这个建议!
对于这个问题,我不是试图避免这个问题,而是要理解它.浮点数在设计上本质上是不准确的,但只要注意如何进行构建,则不准确性可以完全可预测和一致.IEEE-754将此描述为只有标准组织才能达到的详细程度.
如果有人能引用,我决定提供小额赏金,
在这个问题中,我不是在寻找替代选项,解决方法或避免问题的方法.感谢您的建议.
在我为移动设备设计的网站上,我有一个用于PIN码的输入字段.我希望文本在输入时隐藏,我希望当移动设备上的用户想要输入PIN时,会弹出数字键盘.当Type ="Number"时,数字键盘会弹出,而当Type ="Password"时,数字键盘不会弹出,而我不能(或者不知道如何)设置Type ="Number and Password".
有任何想法吗?
提前致谢!