编辑:我已经发现并发布了一个高效优雅的解决方案,可以将ID转换
3141592为字符串,如vJST向后转换.它可用于PHP:https://github.com/delight-im/PHP-IDs
提供一些背景知识,它使用Knuth的乘法散列,然后进行基本转换,以生成唯一的,可逆的,非顺序ID.
问题:
我在PHP中有动态页面,其中的内容根据给定的ID显示.id始终通过GET参数提交:page.php?id = X这会导致问题:站点访问者可以枚举id并简单地遍历所有不同的内容页面.当然,这是不可能的.
怎么能解决这个问题?
我的方法是编码链接和表单中的所有ID,以后用作GET参数.在每个页面的开头,给定的id被解码成在数据库中使用的"真实"id.这是一个好方法吗?你会选择另一种方式吗?
我方法的可能解决方案:
我会将整数id转换为基数为38的整数,并将数字替换为给定列表的字符.我会将这些字符用于编码的字符串id:
az 0-9 - _
你会使用其他角色吗?对于这些字符,我的脚本将是这样的:
function id2secure($old_number) {
$alphabet_en = array(0=>'1', 1=>'3', 2=>'5', 3=>'7', 4=>'9', 5=>'0', 6=>'2', 7=>'4', 8=>'6', 9=>'8', 10=>'a', 11=>'c', 12=>'e', 13=>'g', 14=>'i', 15=>'k', 16=>'m', 17=>'o', 18=>'q', 19=>'s', 20=>'u', 21=>'w', 22=>'y', 23=>'b', 24=>'d', 25=>'f', 26=>'h', 27=>'j', 28=>'l', 29=>'n', 30=>'p', 31=>'r', 32=>'t', 33=>'v', 34=>'x', 35=>'z', 36=>'-', 37=>'_');
$new_number = '';
while ($old_number > 0) {
$rest = $old_number%38;
if (!isset($alphabet_en[$rest])) { return FALSE; …Run Code Online (Sandbox Code Playgroud) 我有这样的[Flags]枚举:
[Flags]
public enum Status
{
None = 0,
Active = 1,
Inactive = 2,
Unknown = 4
}
Run Code Online (Sandbox Code Playgroud)
状态枚举可能包含两个值,例如:
Status s = Status.Active | Status.Unknown;
Run Code Online (Sandbox Code Playgroud)
现在我需要创建一个linq查询(LINQ to ADO.NET Entities)并询问状态为s的记录,即Active或Unknown;
var result = from r in db.Records
select r
where (r.Status & (byte)s) == r.Status
Run Code Online (Sandbox Code Playgroud)
当然我得到一个错误,因为LINQ to Entities只知道在Where子句中处理原始类型.
错误是:
无法创建"闭包类型"类型的常量值.在此上下文中仅支持原始类型(例如Int32,String和Guid').
有可行的方法吗?我可能有一个状态枚举,有10个可能的值,并查询5个状态.如何以优雅的方式使用Flags枚举构造查询?
谢谢.
更新
这似乎是一个Linq to Entities问题.我认为在LINQ to SQL中它可以工作(不确定,没有经过测试).
真的很烦人C#似乎强迫你明确命名String.Format中每个参数的索引,如果你想在某个地方添加另一个参数,你必须重新索引字符串或将新参数放在最后.
有没有办法让C#自动执行此操作?
例如(我知道这是毫无意义的小贩,这只是一个例子:)
我开始:
String.Format("{0} {1} {1} {2} {3}", a, b, c, d)
Run Code Online (Sandbox Code Playgroud)
如果我想在开头添加一个参数,我可以执行以下操作之一:
String.Format("{4} {0} {1} {1} {2} {3}", a, b, c, d, e)
String.Format("{0} {1} {2} {2} {3} {4}", e, a, b, c, d)
Run Code Online (Sandbox Code Playgroud)
例如,在Delphi中我可以做到相当于:
String.Format("{} {} {} {2} {} {}", e, a, b, c, d)
Run Code Online (Sandbox Code Playgroud) 我有一个序列用于在oracle表中播种我的(基于Integer的)主键.
看来这个序列并不总是用于在表中插入新值.如何将序列与表中的实际值一起返回?
在工作中,我们使用的是ASP.net 2.0和VSS.VSS是一个野兽,我们不断遇到人们检查文件的问题,并且没有分支 - 让它变得疯狂.我知道SVN/GIT主要由开源开发人员使用,ASP.NET开发人员使用它有什么缺点吗?我一直在内部推动SVN,但我认为GIT可能也是一个很好的选择.我们的团队遍布三大洲.
任何人都有任何想法如何这样做...反向太慢,我想避免使用该功能.
基本上我希望能够在'(abba)出现或'(abcdcba)之类的情况下返回true
对于不对称的东西是假的
COM接口方法可以返回各种HRESULT值来表示传递的无效参数值.我什么E_POINTER时候回来E_INVALIDARG?
据我所知,如果一个方法在封装集合中接收索引并且它超出了界限E_INVALIDARG.如果一个方法接收到一个Interface**指针,它指的是存储一个指向新创建的对象的指针E_POINTER.
HRESULT CImpl::GetItem( long index; Interface** result )
{
if( result == 0 ) {
return E_POINTER;
}
if( index < 0 || index >= internalArray.size() ) {
return E_INVALIDARG;
}
*result = CreateWrapperObject( internalArray[index] );
return S_OK;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果它收到一个WCHAR*文件名为"in"参数的缓冲区并且这WCHAR*是空的呢?是这个E_POINTER还是E_INVALIDARG?
或者一个方法接收一个指向某个结构的指针,并期望通过该指针填充结构,并且该指针为空 - 是这个E_POINTER还是E_INVALIDARG?
HRESULT CImpl::SaveToFile( WCHAR* fileName )
{
if( fileName == 0 ) { …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个免费/开源关系数据库,用于商业asp.net 3.5项目.有什么建议?
我刚开始玩lambdas和Linq表达自学.我为此采取了简单的因子问题.在一个复杂的小场景中,找到给定n个数的阶乘(无需使用递归循环).
在我试过的代码下面.但这不起作用.
public void FindFactorial(int range)
{
var res = Enumerable.Range(1, range).Select(x => Enumerable.Range(0, x).Where(y => (y > 1)).Select(y => y * (y-1)));
foreach (var outt in res)
Console.WriteLine(outt.ToString());
}
Run Code Online (Sandbox Code Playgroud)
这是我使用的程序
我知道我搞砸了某个地方.谁能告诉我什么是错的以及任何其他可能的解决方案.
编辑:
我打算让这个线程打开一段时间......因为这是我迈向lambda的最初步骤..我发现所有的答案都非常有用且信息丰富..而且它会变得有趣而且很好学习看到不同的接近方式这个问题.